理解NAT类型
2014-02-21 15:48:00

NAT是位于内、外网之间,用来进行内、外网地址转换的,在当前仍是IPv4为主流协议的IP网络,NAT技术的应用非常广,因为它可以节约紧缺的公网IP地址。但别以为NAT技术很简单,认为只是把内部(或外部)地址转换成外部(或内部)地址。

网络地址转换(Network Address Translation或简称NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading),是一种在IP封包通过路由器或防火墙时重写源IP地址或目的IP地址的技术。这种技术被普遍使用在有多台主机但只通过一个公有IP地址访问因特网的私有网络中。根据规范,路由器是不能这样工作的,但它的确是一个方便并得到了广泛应用的技术。当然NAT也让主机之间的通信变得复杂,导致通信效率的降低。

NAT路由器是被配置为转换内部网络(inside network)中的非注册内部本地IP地址(inside local addresses)为注册IP地址(registered IP addresses)。当内部网络中使用非注册IP地址的设备要与外部公用网络(public network)进行通信时,就会使用NAT。

NAT类型
NAT的类型有多种,大致有三种类型:静态NAT(Source NAT)、动态地址NAT(Pooled NAT)、网络地址端口转换NAPT(Port-Level NAT);但在应用中以下两种是使用的最多的,也最为常见。

可将NAT分为两种不同的类型:Source NAT (SNAT) 与 Destination NAT (DNAT)

Source NAT 就是将改变第一个封包的来源地址:例如,为传入的连线做 caching 的动作。Source NAT 永远会在封包传出网线之前就做好 post-routing 的动作。封包伪装(Masquerading)就是一个 SNAT 特例。

Destination NAT 就是将改变第一个封包的目的地地址:例如要为传出的连线做 caching 的动作。Destination NAT 永远会在封包从网线进入之后就马上做好 pre-routing 的动作。Port forwarding、负载分担、以及透明代理,都属于 DNAT。

pre-routing 就是封包在进行routing 之前的处理,通常是从界面进入之后处理。

post-routing 就是封包在经过routing 判断之后的处理,通常是送出界面之前的处理。

而SNAT通常是在POSTROUTING上发生,DNAT则通常在PREROUTING上发生。

SNAT是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样接收方就认为数据包的来源是被替换的那个IP的主机。

MASQUERADE是用发送数据的网卡上的IP来替换源IP,因此对于那些IP不固定的场合,比如拨号网络或者通过dhcp分配IP的情况下,就得用MASQUERADE。

SNAT是Source network address translation的缩写,即源地址转换。

比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP,PC机访问外部网络时,路由器将数据包的报头中的源地址替换成路由器的IP,当外部网络的服务器,比如网站web服务器接到访问请求的时候,他的日志记录下来的是路由器的IP,而不是PC机的内网IP,这是因为这个服务器收到的数据包的报头里面的“源地址”已经被替换了。所以叫做SNAT,基于源地址的地址转换。

DNAT,就是指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,你实际上访问的是B,而B机位于内部系统中,在公网上无法直接访问到。

因为路由是按照目的地址来选择的,DNAT是在PREROUTING链上来进行的,而SNAT是在数据包发送出去的时候才进行,因此是在POSTROUTING链上进行的。

DNAT是Destination network address translation的缩写,即目标网络地址转换。

典型的应用是:有个web服务器放在内网配置内网IP,前端有个防火墙配置公网IP,互联网上的访问者使用公网IP来访问这个网站,当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网IP,防火墙会把这个数据包的报头改写一次,将目标地址改写web服务器的内网IP,然后再把这个数据包发送到内网的web服务器上,这样数据包就穿透了防火墙,并从公网IP变成了一个对内网地址的访问了。

MASQUERADE, 地址伪装,在iptables中有着和SNAT相近的效果,但也有一些区别。使用SNAT的时候,出口IP的地址范围可以是一个,也可以是多个,例如:如下命令表示把所有10.8.0.0网段的数据包SNAT成172.18.0.3的IP然后发出去:
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.0.0 -o eth0 -j sant --to-source 172.18.0.3

如下命令表示把所有10.8.0.0网段的数据包SNAT成172.18.0.3/172.18.0.4/172.18.0.5等几个IP然后发出去:
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.0.0 -o eth0 -j sant --to-source 172.18.0.3-172.18.0.5

这就是SNAT的使用方法,既可以NAT成一个地址,也可以NAT成多个地址。

但对于SNAT,不管是几个地址,必须明确指定要SNAT的IP。假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口IP会改变,而且改变的幅度很大,不一定是某个范围内的地址。

这个时候如果按照现在的方式来配置iptables就会出现问题了,因为每次拨号后,服务器地址都会变化,而iptables规则内的IP是不会随着自动变化的,每次地址变化后都必须手工修改一次iptables,把规则里边的固定IP改成新的IP,这样是非常不好用的。MASQUERADE就是针对这中场景而设计的,它的作用是,从服务器的网卡上,自动获取当前IP地址来做NAT:
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.0.0 -o eth0 -j MASQUERADE

这样配置就不用指定SNAT的目标IP了。不管现在eth0的初看获得了怎样的动态IP,MASQUERADE会自动读取eth0现在的IP地址,然后做SNAT出去,这样就实现了很好的动态SNAT地址转换。  


NAT其它用途实例

负载均衡: 目的地址转换NAT可以重定向一些服务器的连接到其他随机选定的服务器。

失效终结: 目的地址转换NAT可以用来提供高可靠性的服务。如果一个系统有一台通过路由器访问的关键服务器,一旦路由器检测到该服务器当机,它可以使用目的地址转换NAT透明的把连接转移到一个备份服务器上。

透明代理: NAT可以把连接到因特网的HTTP连接重定向到一个指定的HTTP代理服务器以缓存数据和过滤请求。一些因特网服务提供商就使用这种技术来减少带宽的使用而不用让他们的客户配置他们的浏览器支持代理连接。

参考文档

网络地址转换

防火墙软件Netfilter之NAT技术