iptables是一个配置Linux内核防火墙的命令行工具,是netfilter项目的一部分。术语iptables也经常代指该内核级防火墙。iptables用于ipv4,ip6tables用于ipv6。
( nftables已经包含在Linux kernel 3.13中,以后会取代iptables成为主要的Linux防火墙工具。 )
版本
iptables v1.4.21
介绍
理解 iptables 如何工作的关键是下面这张图。图中在上面的小写字母代表”表”,在下面的大写字母代表”链”。从任何网络端口进来的每一个 IP 数据包都要从上到下的穿过这张图。一种常见的困扰是认为 iptables 对从内部端口进入的数据包和从面向互联网端口进入的数据包采取不同的处理方式,相反,iptabales 对从任何端口进入的数据包都会采取相同的处理方式。可以定义规则使 iptables 采取不同的方式对待从不同端口进入的数据包。当然一些数据包是用于本地进程的,因此在图中表现为从顶端进入,到Local Process
停止,而另一些数据包是由本地进程生成的,因此在图中表现为从Local Process
发出,一直向下穿过该流程图。
- 数据包到达网络接口,比如 eth0
- 进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包
- 如果进行了连接跟踪,在此处理
- 进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等
- 进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤
- 决定路由,看是交给本地主机还是转发给其它主机
一种情况是,数据包就是发给本地主机的: - 进入 mangle 表的 INPUT 链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改
- 进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口
- 交给本地主机的应用程序进行处理
- 处理完毕后进行路由决定,看该往那里发出
- 进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前
- 连接跟踪对本地的数据包进行处理
- 进入 mangle 表的 OUTPUT 链,在这里我们可以修改数据包,但不要做过滤
- 进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT
- 再次进行路由决定
- 进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤
- 进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改
注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理 - 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤
- 进入出去的网络接口
一种情况是,数据包要转发给其它主机: - 进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改
- 进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的
- 进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改
- 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤
- 进入出去的网络接口
该流程图描述链了在任何接口上收到的网络数据包是按照怎样的顺序穿过表的交通管制链。第一个路由策略包括决定数据包的目的地是本地主机(这种情况下,数据包穿过 INPUT 链),还是其他主机(数据包穿过 FORWARD 链);中间的路由策略包括决定给传出的数据包使用那个源地址、分配哪个接口;最后一个路由策略存在是因为先前的 mangle 与 nat 链可能会改变数据包的路由信息。数据包通过路径上的每一条链时,链中的每一条规则按顺序匹配;无论何时匹配了一条规则,相应的 target/jump 动作将会执行。最常用的3个 target 是 ACCEPT, DROP ,或者 jump 到用户自定义的链。内置的链有默认的策略,但是用户自定义的链没有默认的策略。在 jump 到的链中,若每一条规则都不能提供完全匹配,那么数据包像这张图片描述的一样返回到调用链。在任何时候,若 DROP target 的规则实现完全匹配,那么被匹配的数据包会被丢弃,不会进行进一步处理。如果一个数据包在链中被 ACCEPT,那么它也会被所有的父链 ACCEPT,并且不再遍历其他父链。然而,要注意的是,数据包还会以正常的方式继续遍历其他表中的其他链。
表(Tables)
- raw 用于配置数据包,raw 中的数据包不会被系统跟踪。
作用:决定数据包是否被状态跟踪机制处理,优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能
内核模块:iptable_raw
chains:OUTPUT, PREROUTING - filter 是用于存放所有与防火墙相关操作的默认表。
作用:过滤数据包
内核模块:iptables_filter
chains:INPUT, FORWARD, OUTPUT - nat 用于网络地址转换(例如:端口转发)。
作用:网络地址转换
内核模块:iptables_nat
chains:PREROUTING, POSTROUTING, OUTPUT - mangle 用于对特定数据包的修改。
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS
内核模块:iptable_mangle
chains:PREROUTING, POSTROUTING, INPUT, OUTPUT, FORWARD - security 用于强制访问控制网络规则。
Todo…
表之间的顺序:raw –> mangle –> nat –> filter
链(Chains)
- 表由链组成,链是一些按顺序排列的规则的列表。
默认的filter
表包含INPUT
,OUTPUT
和FORWARD
3条内建的链,这3条链作用于数据包过滤过程中的不同时间点,nat
表包含PREROUTING
,POSTROUTING
和OUTPUT
链。 - 默认情况下,任何链中都没有规则,可以向链中添加自己想用的规则
链的默认规则通常设置为ACCEPT
,如果想确保任何包都不能通过规则集,那么可以重置为DROP
。默认的规则总是在一条链的最后生效,所以在默认规则生效前数据包需要通过所有存在的规则。 - 用户可以加入自己定义的链,从而使规则集更有效并且易于修改。
规则(Rules)
数据包的过滤基于 规则。规则由一个目标(数据包包匹配所有条件后的动作)和很多匹配(导致该规则可以应用的数据包所满足的条件)指定。一个规则的典型匹配事项是数据包进入的端口(例如:eth0 或者 eth1)、数据包的类型(ICMP, TCP, 或者 UDP)和数据包的目的端口。
目标使用-j
或者--jump
选项指定。目标可以是用户定义的链(例如,如果条件匹配,跳转到之后的用户定义的链,继续处理)、一个内置的特定目标或者是一个目标扩展。内置目标是 ACCEPT, DROP, QUEUE 和 RETURN,目标扩展是 REJECT and LOG。如果目标是内置目标,数据包的命运会立刻被决定并且在当前表的数据包的处理过程会停止。如果目标是用户定义的链,并且数据包成功穿过第二条链,目标将移动到原始链中的下一个规则。目标扩展可以被终止(像内置目标一样)或者不终止(像用户定义链一样)。
策略(police)
Usage
示例
Todo…