【Linux 驱动】Netfilter/iptables (八) Netfilter的NAT机制

NAT是Network Address Translation的缩写,意即“网络地址转换”。从本质上来讲,是经过修改IP数据首部中的地址,以实现将一个地址转换成另外一个地址的技术。

固然在某种状况下,修改的不只仅是IP首部的来源或目的地址,还包括其它要素。
随着接入Internet的计算机数量不断猛增,IP地址资源也就越发显得捉襟见肘。这也是Ipv6出现的一大缘由。web

咱们如今全部的IP地址是32位,意味着其表明的主机数量是有限的(2^32 ~= 42亿),实际是不够用的(计算机、路由器、网络设备,PDA、无线网络电话等等都要占用IP地址)。安全

当初划分IP时,各保留一段私有IP区间。私网IP(私有IP)是指这些IP只能在企业内部使用,而没法应用在因特网上,简而言之,就是私有IP不能直接与Internet进行互相通讯。服务器

目前NAT技术更多地被使用在将一个私网IP地址网段,转换为一个或几个公网IP地址,以实现私网与Internet的互相通信。
Internet上的路由器若是看到这些私有IP的数据包,就会将其丢弃。网络

咱们先来经过一个例子解释下这个问题:
在下图中,咱们在192.168.0.0/24这个私有ip与10.0.1.0/24这个公有ip加了个路由器。假设10.0.1.200是公网ip。svg

这里写图片描述

首先,192.168.0.1的这台主机尝试访问Internet上的1.2.3.4这台主机,所以,192.168.0.1主机会发送一个请求数据包给默认网关,这个数据包的源ip和目的ip如图中标记的1所示,来源ip是192.168.0.1,目的ip是1.2.3.4,因为是路由器的缘故,这个数据包的源ip和目的ip地址都不会发生改变,接着,路由器会转发这个数据包给1.2.3.4主机,当1.2.3.4主机收到请求数据包后,其源ip和目的ip如3所示。而后,1.2.3.4主机响应请求,回送一个数据包给192.168.0.1,可是该数据包中的目的ip是192.168.0.1,是一个私有ip,所以这个数据包不可能被回送给192.168.0.1,也就不能进行正常通讯。xml

为了提升Internet上数据包的传输效率,Internet上的路由器一般不检查数据包中的“来源IP”,而只会看目的端的IP,因此私有IP的主机能够发出请求,可是得不到回应。blog

这个问题的解决办法就落到了咱们今天要介绍的NAT机制上。只要经过NAT的机制,就可让成千上万台计算机同时经过一个公网IP来链接Internet。网络安全

下面咱们大体介绍下NAT原理:进程

这里写图片描述

与上面路由器的区别在于,咱们多个个NAT机制,NAT主机将这个数据包内的“来源IP”改为NAT主机上的公网IP(10.0.1.200),如标记2所示,这样一来,该数据包的源ip和目的ip都变成了公有IP,同时,NAT主机会将这个数据包的信息记录起来,接下来,这个数据包发送到了1.2.3.4。该主机响应,发回响应数据报的时候,这个数据包的目的ip成了10.0.1.200这个公网ip,而不是192.168.0.1这个私有ip,这样该数据包就能够顺利的到达NAT主机,而后NAT主机根据以前记录下来的信息中找到当初NAT主机关于这个的转换记录,再转回来,该数据包的目的IP就成了真正的目的主机192.168.0.1这个私有ip,但此时已经不是在Internet上了,因此这个数据包是能够经过NAT主机回送给咱们的私有IP主机的。图片

这样一来,经过NAT机制,就成功实现了私有IP经过NAT主机去访问Internet上的资源。

除此以外,NAT机制应用在客户端,能够隐藏客户端的IP,由此达到保护客户端主机免于Internet的攻击行为,以及节省公用IP的使用量;应用在服务器端,则能够保护服务器端主机在Internet上的安全。

(须要知道,事实上,单靠NAT机制并非万能的。)

对于NAT,有两个名字须要了解:那就是SNAT和DNAT,根据上面的分析以及这个名字,咱们很容易得知。SNAT就是变动Source IP的机制,DNAT就是变动 Destination IP的机制。

NAT种类繁多,有一对1、多对多、一对多和NATP等四种。

从下面这张图能够看出,NAT机制出如今PREROUTING、OUTPUT和POSTROUTING这三个chain中

这里写图片描述

下面如下图NAT的结构为例,介绍NAT的完整结构,并解释每一个链的用途。

这里写图片描述

一、 PREROUTING
该链的位置在整个NAT机制的最前面,该链的功能在于执行DNAT的任务,所以在执行DNAT时,几乎是数据包一旦进入NAT机制,数据包内的 “Destination IP” 即被修改,而这个顺序问题在整个防火墙的设置上是很是重要的。
二、POSTROUTING
该链的任务是修改数据包内的“来源端IP”,也就是说,该链的功能用于执行SNAT的任务,该链位于整个NAT机制的最末端,所以当咱们执行SNAT操做时,Source IP是在整个NAT机制的最末端才会被修改的。
三、OUTPUT
当本机进程生成数据包并向外发送时,这个数据包会先交给路由表来判决路由,接着数据包进入OUTPUT链,最后进入POSTROUTING链,而后离开本机。这个数据包是不可能通过PREROUTING链,前面说到PREROUTING链的功能是执行DNAT的任务,也就是修改目的端IP,因此由本机进程生成的数据包,须要经过OUTPUT链,而这个OUTPUT链的功能就是执行DNAT的任务。因此对于本机进程生成的数据包的DNAT规则是要放在OUTPUT链以内,而不是PREROUTING中。

关于NAT机制的分类,咱们这里就不赘述了。后面咱们将深刻到Netfilter 源码内部探索SNAT机制和DNAT机制。

参考资料: 《Linux网络安全技术与实现》