在企业实际生产环境中,iptables是非常有用的nat与防火墙工具,它的使用频率远比selinux高得多,我们在工作当中一般都直接将selinux关掉(当然,这是因为selinux防火墙太牛了,而且比较难使用,但是如果你能够定下心来将selinux学好的话,个人感觉你的水平能够上升不止一个台阶),所以,iptables就成为了我们很多方面都需要依赖的工具,下面就来浅谈一下iptables的工作原理与端口转发功能的实现。
一、netfilter的工作原理
netfilter的实质是一种内核防火墙架构,可实现安全策略中的许多功能,如数据包过滤与处理,地址伪装,透明代理,动态网络地址转换(NAT),以及基于用户及媒体访问控制(MAC)地址的过滤和基于状态的过滤,包速率限制等。
那在这里先简单介绍一下netfilter的大致工作流程,即一个数据包在到达linux网络接口(网卡)的时候如何处理这个包,以及如何用iptables控制这个数据包。
netfilter内部分为三个表,分别为filter,nat,mangle,每个表下面又分为不同的操作链(chains),下面详细介绍。
1、filter表(过滤):这个表主要用于防火墙的功能,该表中定义了三个链,分别为INPUT、FORWARD、OUTPUT,也就是对包的出入与转发进行定义的三个过滤链。
2、nat表(网络地址翻译):这个表主要用于实现地址转换和端口转发功能,该表中定义了三个链,分别是PREROUTING,POSTROUTING,以及OUTPUT,下面将会进行详细说明。
3、mangle表(自定义表):该表中包括filter表与nat表的所有chains,可以进行一些自定义的操作,同时mangle表中的chains在netfilter中对包的处理流程中处于较为优先的位置。
二、nat表中各条chain的工作流程详解
1、PREROUTING(DNAT)
PREROUTING这个chain在filter表的最前面,当一个数据包来到linux的网络借口的时候首先通过mangle的PREROUTING,然后再通过nat的PREROUTING,而这条链是数据包在过路由之前就要过的。
在上图中,最上面的菱形部分叫做routing,它就是linux的路由系统(它可以实现策略路由等一些高级特性),而在PREROUTING链中我们对包的操作是DNAT操作(即改变目的地址和端口,通常用在端口转发,或者nat到内网的DMZ区),就是说的当一个包来的时候我们可以用PREROUTING链改变它的目标地址,然后才能进入路由系统。所以PREROUTING这个chain要在routing之前。
2、FORWARD
当包过了两个PREROUTING链之后(mangle与nat),出现了转折,即图形下方的菱形:FORWARD,转发。在这里有一个对目的地址的判断(所以这里同样告诉我们PREROUTING要放在最前面,要先改变了目标地址之后才能够对目标地址进行判断)。
如果接受到的包的目标地址是本机的ip,那么包就向上走,进入INPUT链处理,若非本地,就进入FORWARD链过滤,当linux收到一个目标地址非本地的包,,linux会把这个包丢弃,若要打开转发功能,则可使用命令:echo "1" > /proc/sys/net/ipv4/ip_forward
打开转发之后,这个数据包将进入FORWARD链,在FORWARD链里,可以定义详细规则(是否允许通过,改变包的方向流程)。
3、POSTROUTING(SNAT)
若我们使用ACCEPT放过了这个包,它将进入POSTROUTING部分(如果是转发的话应该要再次进行路由选择再将它送出,此时linux系统已经为这个包选好了路由,找到了合适的借口送出这个包了)。
在这个链里要进行一个非常重要的动作(称为SNAT),即修改源ip地址!!
那么Linux如何做SNAT呢?比如一个内网的10.1.1.11的pc访问202.2.2.2的一个web服务器,
linux的内网接口10.1.1.1在收到这个包之后把原来的 PC的 ip10.1.1.11改变为60.1.1.1的合法地址然
后送出,同时在自己的ip_conntrack表里面做一个记录,记住是内网的哪一个ip的哪 个端口访问的这个
web服务器,自己把它的源地址改成多少了,端口改成多少了,以便这个web服务器返回数据包的时候
linux将它准确的送回给发送请求 的这个pc.
到此概念大体说完。
文章出处:http://wwdhks.blog.51cto.com/839773/1154032