iptables
是 Linux 内核集成的包过滤防护墙系统,几乎所有的 Linux 发行版都会包含 iptables
的功能。iptables
有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙设置。
netfilter/iptables
过滤防火墙系统是一种强大的工具,可以用于添加、编辑和除去规则。这些规则是在做信息包过滤时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组在我们所谓的链 (Chain) 中。
虽然 netfilter/iptables
包过滤系统被称为单个的实体,但它实际上由两个组件 netfilter
和 iptables
组成。
netfilter
组件是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables
组件则是一种工具,是用户空间的程序。它使得插入、修改和除去信息包过滤表变得容易。
这段话各种翻译腔,一定是翻译的英文资料。
netfilter/iptables
的最大优点是他们可以配置有状态的防火墙。有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,分别是 ESTABLISHED
, INVALID
, NEW
和 RELATED
。
- 状态
ESTABLISHED
指出该信息包属于已经建立的连接,该连接一直用于发送和接收信息并且完全有效。 INVALID
状态指出该信息包与任何一直的流或者连接都不相关联,它可能包含错误的数据或者包头。NEW
状态意味着该信息包已经或者将启动新的连接,或者它尚未用于发送和接受信息包的连接相关联。RELATED
状态表示该信息正在启动新连接,以及它与已建立的连接相关联。
netfilter/iptables
的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。您可以定制自己的规则来满足您的特定需求,从而只允许您想要的网络流量进入系统。
另外,netfilter/iptables是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案。
1 原理
iptables
的原理主要是对数据包的控制,见下图:
- 一个数据包进入网卡时,它首先进入
PREROUTING
链,内核根据数据包目的 IP 判断是否需要转发除去; - 如果数据包就是发送给本机的,它就会进入图中下面这个链路,到达
INPUT
链。数据包到了INPUT
链后,任何进程都可以收到这个。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT
链,然后到达POSTROUTING
链输出; - 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动进入
FORWARD
链,然后到达POSTROUTING
链输出。
2 规则、表和链
2.1 规则(Rules)
规则 (Rules) 其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息过滤表中,这些规则分别指定了源地址,目的地址,传输协议 (如 TCP, UDP, ICMP) 和服务类型 (如 HTTP, FTP 和 SMTP)等。当数据包与规则匹配时,iptables
就根据规则所指定的方法来处理这些数据包,如放行 (ACCEPT
),拒绝 (REJECT
) 和丢弃 (DROP
) 等。配置防火墙的主要工作就是添加、修改和删除这些规则。
2.2 链(Chains)
链 (Chains) 是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或者数条规则。当一个数据包到达一个链时,iptables
就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则 iptables
会继续检查下一条规则。如果该数据包不符合链中任何一条规则,那么 iptables
就会根据该链预先定义的默认策略来处理这个数据包。
2.3 表(Tables)
表 (Tables) 提供特定的功能。iptables
内置了四个表,分别是 raw
表,filter
表, nat
表和 mangle
表,分别用于实现包过滤,网络地址转换和包重构功能。
2.3.1 RAW 表
只是用在 PREROUTING
链和 OUTPUT
链上。因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一旦用户使用了 RAW 表,在某个链上,RAW 表处理完之后,将跳过 NAT 表和 ip_contrack
处理,即不再做地址转换和数据包的连接跟踪处理了。
2.3.2 Filter 表
主要用于过滤数据包。该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在 filter 表中指定的规则来实现对数据包的过滤。Filter 表是默认的表,如果没有指定哪个表,iptables
就默认使用 filter
来执行所有命令。filter
表包含了 INPUT
链,FORWARD
链,OUTPUT
链。在 filter
表中只能对数据包进行接收、丢弃等操作,而无法对数据包进行更改。
2.3.3 NAT 表
主要用于网络地址转换。该表可以实现一对一,一对多,多对多等 NAT操作,iptables
就是使用该表实现共享上网的。NAT表包含了 PREROUTING
链(修改即将到来的数据包),POSTROUTING
链(修改即将出去的数据包),OUTPUT
链(修改路由之前本地生成的数据包)。
2.3.4 mangle 表
主要用于对指定数据包进行更改,在内核版本 2.4.18 后的 Linux 版本中该表包含的链为:INPUT
链(处理进入的数据包),FORWARD
链(处理转发的数据包),OUTPUT
链(处理本地生成的数据包)POSTROUTING
链(修改即将出去的数据包),PREROUTING
链(修改即将到来的数据包)
3 优先级与处理顺序
规则表之间的优先顺序为: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)。