端口回流与dns-map与域内NAT
回流的概念:
端口回流&DNS-map&域内NAT
组网分析:
某企业内部一台主机建了个WEB服务站点端口80,然后在网关Router上映射80端口到Web Server的80端口,这样外网上上就能以公网地址202.38.1.1:80的地址访问到Web Server的站点了。
但是Host A通过公网地址却无法访问服务器,如果Router支持端口回流的话那么Host A就可以通过公网地址访问内部服务器。
原因分析:
如上图可以很明显的看出报文①发送到Router,Router根据NAT映射将目标地址改为10.110.10.1发送报文②。但是源地址不变仍为10.110.10.3。而后Web Server接收报文②后,发回③报文给Host A。注意此报文发送没有经过Router而是直接走二层。所以就导致了一个问题,Host A的请求目标为202.38.1.1,但是回应的源地址为10.110.10.1。所以导致会话不能建立。(但是ICMP是可以的,因为ICMP是基于进程号—sequence number)
解决方法:
1) 将Host A和Web Server的地址设置为不同网段,这一步可以通过划分vlan解决,即服务器和主机在不同的网段。或者可以在路由器的内网接口下配置sub地址,也能解决此问题。只要数据流经过Router就可以正常访问。
2) 路由器支持端口回流,其原理如下:
当路由器收到Host A发送的向202.38.1.1发送的TCP请求报文时,路由器将目标地址改为NAT的映射后的私网地址(10.110.10.1),端口为80。同时也把请求报文的源地址改为内部网关的地址即10.110.10.10,端口1025。之后Web服务器收到此请求报文。并对其回应。因为报文的源地址为网关地址。所以此报文会再经过网关。从而再次转换。达到Host A可以正常访问服务器的目的。其实这一步也可以理解为基于源地址转换的NAT。即本文后面要说到的域内NAT。
为什么说是端口回流,因为在大多数soho级的路由器中-如D-Link的路由有一个专门的选项为“端口回流”(此特性要看具体型号)如下:
通过NAT完成“端口回流“
但是在中高端企业级路由器上则没有这么一说。因为此功能完全可以由路由器NAT来完成。假设Router为H3C的路由器。配置如下:
acl number 2000
rule 10 permit source 10.110.10.0 0.0.255.255
rule 15 deny
#
acl number 3000
rule 10 permit ip source 10.110.10.0 0.0.255.255 destination 10.110.10.1 0
rule 15 deny ip
#
interface GigabitEthernet1/1
description inside
nat outbound 2000(此处也可用acl 3000)
nat server protocol icmp global 202.38.1.1 inside 10.110.10.1
nat server protocol tcp global 202.38.1.1 telnet inside 10.110.10.1 telnet
nat server protocol tcp global 202.38.1.1 3389 inside 10.110.10.1 3389
ip address 10.110.10.10 255.255.0.0
#
interface GigabitEthernet1/2
description outside
nat outbound 2000
nat server protocol icmp global 202.38.1.1 inside 10.110.10.1
nat server protocol tcp global 202.38.1.1 telnet inside 10.110.10.1 telnet
nat server protocol tcp global 202.38.1.1 3389 inside 10.110.10.1 3389
ip address 202.38.1.1 255.255.255.0
如上所示,外网口和内网口的配置全部相同。这样内网数据在访问web的服务器地址时202.38.1.1,在内网接口G1/1根据NAT Server将目标地址转换为内网地址10.110.10.1,源地址根据nat outbound 2000把源地址改为G1/1接口的地址。即和上面端口回流原理一样。如此即可建立连接。
或者很简单的将内网的PC和Web Server分到不同的网段。PC改为10.111.10.3网关为10.111.10.1,配置如下:
interface interface GigabitEthernet1/1
description inside
nat server protocol icmp global 202.38.1.1 inside 10.110.10.1
nat server protocol tcp global 202.38.1.1 telnet inside 10.110.10.1 telnet
nat server protocol tcp global 202.38.1.1 3389 inside 10.110.10.1 3389
ip address 10.110.10.10 255.255.0.0
ip address 10.111.10.1 255.255.0.0 sub
而此种方式不需要内网接口配置nat outbound,比较简单。
ping的效果:
C:\Users\MELODY>ping 10.110.10.1
正在 Ping 10.111.10.1 具有 32 字节的数据:
来自 202.38.1.1 的回复: 字节=32 时间<1ms TTL=255
来自 202.38.1.1 的回复: 字节=32 时间<1ms TTL=255
来自 202.38.1.1 的回复: 字节=32 时间<1ms TTL=255
来自 202.38.1.1 的回复: 字节=32 时间<1ms TTL=255
C:\Users\MELODY>ping 202.38.1.1
正在 Ping 202.38.1.1 具有 32 字节的数据:
来自 202.38.1.1 的回复: 字节=32 时间<1ms TTL=255
来自 202.38.1.1 的回复: 字节=32 时间<1ms TTL=255
来自 202.38.1.1 的回复: 字节=32 时间<1ms TTL=255
来自 202.38.1.1 的回复: 字节=32 时间<1ms TTL=255
上下比较对于ICMP来说即使ping的目标和回应的地址不同,凭借ICMP的sequence number-ICMP也是可达的。由此我们更应想到,对NAT Server的原理:当数据包进入接口时对数据包的目标地址进行NAT Server的转换,在出接口时对数据包的源地址进行转换---如果地址都匹配NAT Server配置的地址。
关于域内NAT
我相信,凡事配置过防火墙的工程师都应配置过域内NAT,域内NAT的原理和如上H3C路由器的内网接口配置nat outbound的原理如出一辙。只是防火墙配置的位置为域内,而路由器为接口。具体配置可参考我之前的“华赛USG 域内NAT”一文。
关于dns-map
Dns-map是H3C的一个技术。nat dns-map命令用来配置一条域名到外部IP地址、端口号、协议类型的映射。此命令用于配置内部服务器的“域名-外部IP地址、端口、协议类型”的映射,使内部主机在内部网络无DNS服务器的情况下,可以使用不同的域名区别并访问对应的内部服务器。最多允许配置16条映射。
该功能的实现是对原有DNS ALG的补充和修改。DNS ALG模块的处理流程:内网DNS服务器发向其上级DNS服务器的DNS回应报文中的地址,使用nat server命令中设置的DNS映射地址替换原有DNS回应报文中的地址。
配置dns-map后的处理流程:对外网DNS server发向内网PC的DNS回应报文中,如果该报文中包含的域名是使用dns-map命令中定义的,那么替换该报文中的公网地址为使用nat server命令映射的私网地址。
配置实例:
客户需求:
1) 使用H3C路由器作为NAT设备作easy nat实现内网对公网的访问
2) 内部服务器能够被外网以域名方式访问,域名已注册,能被公网dns服务器正确解析为202.38.1.1
3) 内网用户也能像外网用户一样通过域名访问内网服务器
参考配置:
nat dns-map www123.com 202.38.1.1 80 tcp
nat dns-map ftp.123.com 202.38.1.1 21 tcp
nat dns-map smtp.123.com 202.38.1.1 25 tcp
nat dns-map pop.123.com 202.38.1.1 110 tcp
#
acl number 2000
rule 10 permit ip source 10.110.0.0 0.0.255.255
#
interface GigabitEthernet1/1
description inside
ip address 10.110.10.10 255.255.0.0
#
interface GigabitEthernet1/2
description outside
nat outbound 2000
nat server protocol tcp global 202.38.1.1 www inside 10.110.10.1 www
nat server protocol tcp global 202.38.1.1 smtp inside 10.110.10.1 smtp
nat server protocol tcp global 202.38.1.1 pop3 inside 10.110.10.1 pop3
nat server protocol tcp global 202.38.1.1 4899 inside 10.110.10.1 4899
nat server protocol tcp global 202.38.1.1 8080 inside 10.110.10.1 8080
nat server protocol udp global 202.38.1.1 dns inside 10.110.10.1 dns
ip address 202.38.1.1 255.255.255.0
要替换的报文如下:
由上可以看出,dns-map将匹配的域名和公网地址的DNS回应报文的解析地址改为了内网地址,如此内网的PC就可以通过内网地址访问服务器了。只是将DNS解析请求发到了公网而已。之后的数据走的都是二层了。但是有个弊端就是PC与服务器的数据流没有经过三层,降低了安全性。