一、【IPtables概述】
谈到iptables,其实它并不是一个单独的个体,它是 netfilter/iptables IP 信息包过滤系统 中两个组件 netfilter 和 iptables的其中一个。Netfilter是由Rusty Russell提出的Linux 2.4 内核防火墙框架,该框架简洁灵活,可实现安全策略应用中的许多功能,如:数据包过 滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址 的过滤和基于状态的过滤、包速率限制等。netfilter/iptables IP 数据包过滤系统是一 款功能强大的工具,可用于添加、编辑和移除规则。我们也常称其为:包过滤防火墙。
IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统,该系统有利于 在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。防火墙在做数据包过滤决定时, 有一套遵循和组成的规则,这些规则存储在专用的数据包过滤表中,而这些表集成在 Linux 内核中。在数据包过滤表中,规则被分组放在我们所谓的链(chain)中。
netfilter 组件也称为内核空间(kernelspace),是内核的一部分,是该包过滤系统中真 正的安全框架(framework),由一些信息包过滤表组成,这些表包含内核用来控制信息 包过滤处理的规则集,是Linux操作系统内核的一个数据包处理模块。
iptables 组件是一种工具,也称为用户空间(userspace),可通过命令行插入、修改和 删除包过滤表中的规则。除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该 工具并安装使用它。我们用iptables命令行工具操作netfilter安全框架。因此,要明白,所 以的操作结果都在net filter中,它才是真正的“防火墙”,而iptables只是操作这一过程的工 具。
netfilter/iptables 的最大优点是它可以配置有状态的防火墙,有状态的防火墙能够指定并记 住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该 信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。 这里有四种有效状态,名称分别为 ESTABLISHED 、 INVALID 、 NEW 和 RELATED。
ESTABLISHED :指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包 并且完全有效。只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状 态会继续匹配这个连接的后续数据包。
INVALID状态: 指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数 据或头。数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪 个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。
NEW状态: 该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连 接相关联。
RELATED状态: 表示该信息包正在启动新连接,以及它与已建立的连接相关联。例 如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。–icmp-type 0 ( ping 应 答) 就是–icmp-type 8 (ping 请求)所RELATED出来的。
二、【iptables之四表五链】
Netfilter 框架/模块中指定了数据包的五个挂载点(Hook Point,我们可以理解为回调 函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包 路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTING、INPUT、 OUTPUT、FORWARD、POST_ROUTING。
INPUT: 当接收到防火墙本机地址的数据包(入站)时
OUTPUT: 当防火墙本机向外发送数据包(出站)时
FORWARD: 当接收到需要通过防火墙发送给其他地址的数据包(转发)时
PRE_ROUTING: 在对数据包作路由选择之前,应用此链中的规则 POST_ROUTING: 在对数据包作路由选择之后,应用此链中的规则
Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序, 它通过 Netfilter 开放的接口来对存放在内核内存中的 各种内建tables(Netfilter的配置 表)进行修改。这些个tables由表tables、链chains、规则rules组成,iptables在应用层负 责修改这个规则文件。类似的应用程序还有 firewalld 。
相关资料:官网
三、【数据包处理示意】
关于 【filter、nat、mangle等规则表说明】:
filter表: 主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如 DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三 个规则链:
INPUT链: INPUT针对那些目的地是本地的包
FORWARD链: FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是 负责转发)的包,即:源和目的都不是本地的数据包,只负责转发改包到别的服务器。 OUTPUT链: OUTPUT是用来过滤所有本地生成的包 ;
Nat表: 主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、 DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可 能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或 Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通 过这个表。表对应的内核模块为 iptable_nat,包含三个链:
PREROUTING链: 作用是在包刚刚到达防火墙时改变它的目的地址, OUTPUT链: 改变本地产生的包的目的地址—–? POSTROUTING链:在包就要离开防火墙之前改变其源地址
Mangle表: 主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服 务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。 包含五个规则链——PREROUTING,POSTROUTING,INPUT,OUTPUT, FORWARD。
raw表: 是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机 制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链—— OUTPUT、PREROUTING
优先级:raw>mangle>Nat>filter
四、iptables工作原理:主要是对数据包的控制
首先说下防火墙中链的概念,防火墙是通过各种规则来匹配过滤ip包的;从而触发相应的 操作,对数据包执行处理,而多个规则串起来就可以形成一类“规则”,这就是链。防火墙 在处理各种数据包时,根据防火墙规则的不同介入时机,iptables涉及5种默认规则链,结 合数据流匹配时间点的不同,可理解如下:
INPUT链: 当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。 OUTPUT链: 当防火墙本机向外发送数据包(出站)时,应用此链中的规则。 FORWARD链: 当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此 链中的规则。
PREROUTING链: 在对数据包作路由选择之前,应用此链中的规则,如DNAT。 POSTROUTING链: 在对数据包作路由选择之后,应用此链中的规则,如SNAT。
INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安 全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在**“网络防火墙 **”中,特别是防火墙服务器作为网关使用时的情况。
防火墙处理数据包的方式(规则):
**ACCEPT:**允许数据包通过
**DROP:**直接丢弃数据包,不给任何回应信息 REJECT:拒绝数据包通过,必要时会给数据发送 端 一个响应的信息。 **SNAT:**源地址转换。在进入路由层面的route之前,重新改写源地址,目标地址不 变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送 出去时候的源地址,并发送给主机。解决内网用户用同一个公网地址上网的问题。 **MASQUERADE,**是SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上 **DNAT:**目标地址转换。和SNAT相反,IP包经过route之后、出本地的网络栈之前,重 新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地 址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地
址。
REDIRECT: 是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定 的目标地址是啥),方便在本机做端口转发。 **LOG:**在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则 除去最后一个LOG,前3条规则匹配数据包后,该数据包不会再往下继续匹配了,所以编 写的规则顺序极其关键.
当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我 们有机会修改数据包的DestIP(目的IP),然后内核的“路由模块“根据“数据包目的IP”以 及“内核中的路由表“判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被 我们修改过了) 如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会沿着图向下 移动,到达INPUT链。数据包到达INPUT链后,任何进程都会–收到它 本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达 POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了) 如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就 会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口 发送出去)
注:在写iptables规则的时候,要时刻牢记这张路由次序图,根据所在Hook点的不同,灵 活配置规则;规则表之间的优先顺序:
Raw——mangle——nat——>filter 规则链之间的优先顺序(分三种情况):
第一种情况:入站数据流向
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址 等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防 火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其 传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序 (比如Apache服务器)进行响应。
第二冲情况:转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选 择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数 据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给 POSTROUTING规则链(是否修改数据包的地 址等)进行处理。
第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首 先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否 修改数据包的地址等)进行处理。
iptables是采用规则堆栈的方式来进行过滤,当一个封包进入网卡,会先检查 Prerouting, 然后检查目的IP判断是否需要转送出去,接着就会跳到INPUT 或 Forward 进行过滤,如果 封包需转送处理则检查 Postrouting,如果是来自本机封包,则检查 OUTPUT 以及 Postrouting。过程中如果符合某条规则将会进行处理,处理动作除了 ACCEPT、 REJECT、DROP、REDIRECT 和MASQUERADE 以外,还多出 LOG、ULOG、DNAT、 SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK等,其中某些处理动作不会 中断过滤程序,某些处理动作则会中断同一规则链的过滤,并依照前述流程继续进行下一 个规则链的过滤(注意:这一点与ipchains不同),一直到堆栈中的规则检查完毕为止。
透过这种机制所带来的好处是,我们可以进行复杂、多重的封包过滤,简单的说,iptables 可以进行纵横交错式的过滤(tables)而非链状过滤(chains)。ACCEPT 将封包放行,进 行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(nat:postrouting)。
下图为数据经过防火墙时,真个数据流在IPtables侧的处理流程示意图: