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