iptables可以检测、修改、转发、重定向和丢弃IPv4数据包
过滤ipv4数据包的代码内置于linux内核中, 按照不同目的被组织成不同表的集合。表由一系列预先定义的链组成,链 包含规则。每一条规则谓词的潜在匹配和一个动作(目标), 如果该谓词为真则执行该动作。
raw 用于配置数据包, raw 中的数据包不会被系统跟踪filter 用于存放所有与防火墙相关操作的默认表nat 用于网络地址转换mangle 用于对特定数据包的修改security 用于强制访问控制网络规则raw→mangle→nat→filter,即先做状态跟踪→在做标记→在做修改源目IP或端口→在做是否过滤
内置的链有默认规则
表由链组成,链是一些按顺序排列的规则的列表。默认的 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 。用于过滤数据Iptables表和链的对应关系
在
iptables的nat表中,OUTPUT链的核心作用是:修改本机生成的数据包的网络地址信息(包括源地址或目的地址),仅对本机进程主动发起的数据包生效,不影响转发的数据包. 和其他链的区别如下:
- 和
nat表的PREROUTING链不同:PREROUTING链处理外部进入本机或需要转发的数据包,而OUTPUT链只处理本机主动发出的数据包- 和
filter表的OUTPUT链不同:filter表的OUTPUT链用于过滤本机发出的数据包(允许 / 拒绝),而nat表的OUTPUT链用于修改地址信息
PREROUTING |
POSTROUTING |
FORWARD |
INPUT |
OUTPUT |
|
|---|---|---|---|---|---|
| raw | Y | N | N | N | Y |
| mangle | Y | Y | Y | Y | Y |
| nat(SNAT) | N | Y | N | N | Y |
| nat(DNAT) | Y | N | N | N | Y |
| filter | N | N | Y | Y | Y |
| security | N | N | Y | Y | Y |

Tips : PREROUTING 和 POSTROUTING 是最外围,规则链是靠时机分的,分为了入站,出站,转发三个时机
数据包的过滤基于规则。规则由一个目标(数据包匹配一条条件后的动作)和很多匹配(导致该规则可以应用的数据包所满足的条件)指定。一个规则的典型匹配事项是数据包进入的网络接口(例如eht0)、数据包的类型(ICMP、TCP、或者UDP)和数据包的目的端口
目标使用 -j 或者 –jump 选项指定。目标可以是用户的自定义链(例如 ,如果条件匹配,跳转到之后的用户自定义的链,继续处理)、一个内置的目标或者是一个目标扩展。内置的目标是 ACCEPT 、 DROP 、 QUEUE 和 RETURN ,目标扩展是 REJECT 或者 LOG 。如果是目标是内置目标,数据包的命运会理解被决定并且在当前表的数据包的处理过程 会停止。如果目标是用户自定义的链,并且数据包成功穿过第二条链,目标将移动到原始链的下一条规则。目标扩展可以被 终止 或者 不终止
网络流程图描述了链在任何接口上收到的网络数据包是按照怎样的顺序穿过表的流量控制链。第一个路由策略包括决定数据包的目的地址是本机(这种情况下,数据包穿过 INPUT 链),还是其他主机(数据包穿过 FORWARD 链);中间的路由策略包括决定给传出的数据包使用哪个源地址,分配哪个网络接口(网卡);最后一个路由策略存在是因为先前的mangle与nat链可能会修改数据包的路由信息。数据包通过路径上的每一条链时, 链中的每一条规则按顺序匹配;无论何时匹配了一条规则,相应的 target/jump 动作将会执行。
在任何时候,若 DROP target 的规则实现完全匹配,那么被匹配的数据包会被丢弃,不会进行进一步处理。如果一个数据包在 链中被 ACCEPT ,那么它也会被所有的父链 ACCEPT ,并且不再遍历其他父链。然而,要注意的是,数据包还会以正常的方式继续遍历其他表中的其他链。
有许多模块可以扩展iptables。例如conntrack,limit