iptables可以检测、修改、转发、重定向和丢弃IPv4数据包
过滤ipv4数据包的代码内置于linux内核中, 按照不同目的被组织成不同表的集合。表由一系列预先定义的链组成,链 包含规则。每一条规则谓词的潜在匹配和一个动作(目标), 如果该谓词为真则执行该动作。
表(Tables)
raw
用于配置数据包,raw
中的数据包不会被系统跟踪filter
用于存放所有与防火墙相关操作的默认表nat
用于网络地址转换mangle
用于对特定数据包的修改security
用于强制访问控制网络规则
规则表之间的顺序:
raw
→mangle
→nat
→filter
,即先做状态跟踪
→在做标记
→在做修改源目IP或端口
→在做是否过滤
链(Chains)
内置的链有默认规则
表由链组成,链是一些按顺序排列的规则的列表。默认的
filter
表包含
INPUT
,
OUTPUT
,
FORWARD
3条内建的
链。这三条链作用于数据包过滤过程中的不同时间点。
nat
表包含PREROUTING,POSTROUTING和OUTPUT链。
默认情况下,任何链中都没有规则。可以向链中添加自己想要的规则。链的默认规则通常设置为
ACCEPT
,如果想要确保任何数据包都不能通过规则集,则修改为
DROP
。默认的规则总是在链的最后生效。
链表
raw
:包含了PREROUTING
和OUTPUT
,用于跟踪报文mangle
:包含了PREROUTING
、INPUT
、FORWARD
、OUTPUT
、POSTROUTING
。用于修改报文nat
:包含了PREROUTING
、OUTPUT
、POSTROUTING
。用于修改ip或者端口filter
:包含了INPUT
、FORWARD
、OUTPUT
。用于过滤数据
规则链之间的顺序
- 入站:PREROUTING→INPUT 路由前发现是自己的,直接进站
- 出站:OUTPUT→POSTROUTING
- 转发:PREOUTING→FORWARD→POSTROUTING
Tips :
PREROUTING
和
POSTROUTING
是最外围,规则链是靠时机分的,分为了入站,出站,转发三个时机
规则链内的匹配顺序:
- 按顺序依次检查,匹配即停止(LOG策略外)
- 若找不到相匹配规则,按该链的默认策略处理
规则(Rules)
数据包的过滤基于规则。规则由一个目标(数据包匹配一条条件后的动作)和很多匹配(导致该规则可以应用的数据包所满足的条件)指定。一个规则的典型匹配事项是数据包进入的网络接口(例如eht0)、数据包的类型(ICMP、TCP、或者UDP)和数据包的目的端口
目标使用 -j 或者
--jump
选项指定。目标可以是用户的自定义链(例如
,如果条件匹配,跳转到之后的用户自定义的链,继续处理)、一个内置的目标或者是一个目标扩展。内置的目标是
ACCEPT
、
DROP
、
QUEUE
和
RETURN
,目标扩展是
REJECT
或者
LOG
。如果是目标是内置目标,数据包的命运会理解被决定并且在当前表的数据包的处理过程
会停止。如果目标是用户自定义的链,并且数据包成功穿过第二条链,目标将移动到原始链的下一条规则。目标扩展可以被
终止 或者 不终止
遍历链(Traversing Chains)
网络流程图描述了链在任何接口上收到的网络数据包是按照怎样的顺序穿过表的流量控制链。第一个路由策略包括决定数据包的目的地址是本机(这种情况下,数据包穿过
INPUT
链),还是其他主机(数据包穿过
FORWARD
链);中间的路由策略包括决定给传出的数据包使用哪个源地址,分配哪个网络接口(网卡);最后一个路由策略存在是因为先前的mangle与nat链可能会修改数据包的路由信息。数据包通过路径上的每一条链时,
链中的每一条规则按顺序匹配;无论何时匹配了一条规则,相应的
target/jump 动作将会执行。
在任何时候,若 DROP
target
的规则实现完全匹配,那么被匹配的数据包会被丢弃,不会进行进一步处理。如果一个数据包在
链中被 ACCEPT
,那么它也会被所有的父链
ACCEPT
,并且不再遍历其他父链。然而,要注意的是,数据包还会以正常的方式继续遍历其他表中的其他链。
模块(Modules)
有许多模块可以扩展iptables。例如conntrack,limit