如何理解Iptables,通俗来讲,它并不是防火墙,而是操纵防火墙的工具。
在此之前,先介绍一些相关概念。
防火墙从逻辑上大体可分为主机防火墙,网络防火墙。

主机防火墙:针对于单个主机的防范。
网络防火墙:一般处于网络的入口处,针对网络入口的防护,它保护网络入口后的整个本地局域网。
主机防火墙与网络防火墙不冲突,往往是共同存在的,网络防火墙是针对集体,主机防火墙是针对单个主机。

从物理上来讲,防火墙可以分为硬件防火墙与软件防火墙

硬件防火墙:从硬件级别实施的防火墙功能,另一部分基于软件实现,性能高,成本高。
软件防火墙:应用软件处理逻辑运行于通用平台上的防火墙,性能低,成本低。

如前面所说,iptables并不是真正的防火墙。我们可以将他理解成一个客户端代理,通过iptables这个代理,可以将用户的安全设定执行到对应的“安全框架”之中,这个安全框架才是真正的防火墙。这个框架的名字叫做netfilter,它位于内核空间。而iptables则只是一个命令行工具,位于用户空间,我们用这个工具操作真正的安全框架。
他俩组成就可以替换昂贵的商业防火墙,而做到封包过滤,封包重定向和网络地址转换(NAT)等功能。

Netfilter是linux操作系统的核心层内部的一个数据包处理模块,它具有如下功能:
网络地址转换
数据包内容修改
以及数据包过滤的网络功能

IPTABLES基础
iptables是以规则为基础办事的,规则事实上就是我们提前预定的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定源地址,目的地址,传输协议(如TCP,UDP,ICMP)和服务类型(HTTP,FTP,SMTP)等。当数据包与规则匹配的时候就按照规则所定义的方法来处理这个数据包,如放行(accept),拒绝(reject),丢弃(drop)等。配置防火墙的主要工作就是添加,修改,删除这些规则。

下面更加深入的阐述下上面的一段话

当客户端访问服务器的web服务时候,客户端发送报文到网卡,而TCP/IP协议栈是内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户的用户空间中的web服务里。而此时,客户端报文的目标终点站是web服务所监听的socket进程上。当web服务需要相应客户端的请求时,web服务所发出的报文终点站是客户端。这时,web服务所监听的端口和ip反而成了原点。
而我们所说的netfilter作为真正的防火墙在内核中,就存在于报文来回的必经之路上,它会在这条路上设置关卡,所有报文经过关卡都会被检查,只有符合条件的才会被放行,不符合条件则会被拦下。于是就出现了
INPUT(管理接受进来的)关卡,和OUTPUT(管理发送出去的)关卡。
而在iptables中,我们把这样的关卡,称之为链。

上述描述场景还存在某些考虑不周的情况,如,当报文发送来时的目的地址并不是我们的本机地址。本机的任务是将其转发。那么,当本机内核支持IP_FORWARD时,我们就会用到iptables其他的关卡,也就是其他的链,它们的就是:“路由前”,“转发”,“路由后”,他们的英文名是:PREROUTING,FORWARD,POSTROUTING.
也就是说,根据实际情况的不同,报文经过的链也会有不同。如报文需要转发,则不用经过INPUT,而是通过PREROUTING==>>FORWARD==>>POSTROUTING
从而实现转发。
以下是常用场景的转发流程:
本机某进程接受报文:PREROUTING-->INPUT
本机某进程发送报文(通常为响应报文):OUTPUT-->POSTROUTING
由本机转发的报文:PREROUTING-->FORWARD-->POSTROUTING

链的概念

现在,我们来思考为何iptables要将关卡称作链呢?
我们知道,防火墙的作用就在于对经过的报文匹配“规则”,然后执行相应的动作。所以,当报文经过该关卡的时候,必须匹配关卡上的规则。但是,关卡里面可不止一个规则,它是拥有多个规则,当我们把多个规则串成一块儿时,链就形成了。
链上的这多个规则会成先后顺序与报文匹配,如果由符合条件的规则,则执行相应的动作。

表的概念

再来看看另一个问题,我们对每个链都设置了一串规则,但是有些规则会十分的相似。比如说,A类规则是负责对IP或者端口过滤,B类规则修改报文,那么这个时候,我们是不是能把实现相同功能的规则放在一起呢,是可以的!我们把相同规则的集合就叫做表!
所以说,不同的规则我们可以放置在不同的表中进行管理,而iptables为我们定制了4中表,每种表对应了不同的功能,我们自定义的规则也不能逃脱这4种功能的范围,所以,必须要明白这4种表的作用。
filter表:负责过滤功能,防火墙;内核模块:iptables_filter
nat表;网络地址转换功能;内核模块:iptables_nat
mangle表:拆解报文,做出修改,并重新封装的功能;内核模块:                                
         iptables_mangle
raw表:关闭nat表上启动的连接追踪机制;内核模块:iptables_raw
我们自定义的规则,也在这4种表内。

表链关系

还需要注意的是,有些链天生不具备某些规则,就像有些规则天生不具备某些能力。打个比方,A规则只负责防空,B规则只负责海防,C规则只负责防御陆地敌人。那么由A,B两规则组成的链就不具备防御陆地敌人的能力。
那就让我们来看看每个链上的规则都存在于那个表种。
PREROUTING      的规则存在于;raw表,mangle表,nat表
INPUT           的规则存在于:mangle表,filter表(centos7中还有nat表,6中没有)
FORWARD         的规则存在于:mangle表,filter表
OUTPUT          的规则存在于:raw表,nat表,filter表,mangle表
POSTROUTING     的规则存在于:mangle表,nat表
但是,在实际应用中,往往是通过“表”作为操作入口,对规则进行定义的。上面之所以采用规则的角度来说,是因为更好的理解。
下来,我们采用表的角度来罗列他们的关系;
raw表中的规则可以被哪些链使用:
PREROUTING,OUTPUT
mangle表中的规则可以被哪些链使用:
PREROUTING,INPUT,POSTROUTING,OUTPUT,FORWARD
nat表中的规则可以被哪些链使用:
PREROUTING,OUTPUT,POSTROUTING(centos7中还有nat)
filter表中的规则可以被哪些链使用:
INPUT,OUTPUT,FORWARD
另外,由于链上存在不同的规则,不同规则存在于不同表中,所以当链中存在4个表的规则时,他们的优先级顺序为:
raw>>mangle>>nat>>filter

自定义链

===

规则

规则由匹配条件和执行动作组成

匹配条件分为基本匹配条件和扩展匹配条件
基本匹配条件:源地址,目的地址
扩展匹配条件:除了基本匹配条件,很多其他条件可以用来匹配,这些广泛的条件叫做扩展条件,这些扩展条件也是netfilter中的一部分,只不过是以模块的形式存在,如果想要使用这些,则需要加载对应的扩展模块。
如:源端口,目标端口

执行动作:
常用的执行动作:
ACCEPT:允许数据包通过
DROP:直接丢弃数据包,不给任何返回信息,此时请求端只有过了超时时间才会有反应。
REJECT:拒绝数据包通过,必要时会发送一个响应信息,发送端刚请求就会收到拒绝消息。
SNAT:原地址转换,解决内网用户用一个公网地址上网的问题
MASQUERADE:是SNAT的一种特殊形式,用于临时的,可变的IP上
DNAT:目标地址转换
REDIRECT:在本机端口做映射
LOG:在/var/log/messages文件中记录日志信息,然后将数据包交给下一个规则。也就是说,除了记录日志外,不对数据包做任何其他操作。

通过以上信息,我们可以将数据包通过防火墙的流程总结为一张图:

iptables 表匹配顺序_客户端

iptables表所对应的链:

iptables 表匹配顺序_iptables 表匹配顺序_02

感谢朱双印老师的博客,收获了很多。