iptables简介
简介
iptables 是一个配置 Linux 内核防火墙的命令行工具,是 Netfilter 项目的一部分。术语 iptables 也经常代指该内核级防火 墙。iptables 可以直接配置,也可以通过许多控制台和图形化前端配置。iptables 用于 ipv4,ip6tables 用于 IPv6。iptables和ip6tables 拥有相同的语法,但是有些特别的选项,对 IPv4 和 IPv6 有些不同的。
基本概念
概念
iptables 可以检测、修改、转发、重定向和丢弃 IPv4 数据包。过滤 IPv4 数据包的代码已经内置于内核中,并且按照不同的目的被组织成表的集合。表由一组预先定义的链组成,链包含遍历顺序规则。每一条规则包含一个谓词的潜在匹配和相应的动作(称为目标),如果谓词为真,该动作会被执行。也就是说条件匹配。iptables 是用户工具,允许用户使用链和规则。很多新手面对复杂的 linux IP 路由时总是感到气馁,但是,实际上最常用的一些应用案例(NAT 或者基本的网络防火墙)并不是很复杂。
理解 iptables 如何工作的关键是这张图。图中在上面的小写字母代表表,在下面的大写字母代表链。从任何网络端口进来的每一个 IP 数据包都要从上到下的穿过这张图。一种常见的错误认知是认为 iptables 对从内部端口进入的数据包和从面向互联网端口进入的数据包采取不同的处理方式,相反,iptables 对从任何端口进入的数据包都会采 取相同的处理方式。可以定义规则使 iptables 采取不同的方式对待从不同端口进入的数据包。当然一些数据包是用于本地进程的,因此在图中表现为从顶端进入,到 <Local Process>
停止,而另一些数据包是由本地进程生成的,因此在图中表现为从 <Local Process>
发出,一直向下穿过该流程图。一份关于该流程图如何工作的详细解释请参考这里
在大多数使用情况下都不会用到 raw,mangle 和 security 表。下图简要描述了网络数据包通过 iptables 的过程:
XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX
+
|
v
+-------------+ +------------------+
|table: filter| <---+ | table: nat |
|chain: INPUT | | | chain: PREROUTING|
+-----+-------+ | +--------+---------+
| | |
v | v
[local process] | **************** +--------------+
| +---------+ Routing decision +------> |table: filter |
v **************** |chain: FORWARD|
**************** +------+-------+
Routing decision |
**************** |
| |
v **************** |
+-------------+ +------> Routing decision <---------------+
|table: nat | | ****************
|chain: OUTPUT| | +
+-----+-------+ | |
| | v
v | +-------------------+
+--------------+ | | table: nat |
|table: filter | +----+ | chain: POSTROUTING|
|chain: OUTPUT | +--------+----------+
+--------------+ |
v
XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX
表 Tables
iptables 包含 5 张表(tables):
-
raw
用于配置数据包,关闭nat表上启用的连接追踪机制,raw
中的数据包不会被系统跟踪。 -
filter
是用于存放所有与防火墙相关操作的默认表。 -
nat
用于 网络地址转换(例如:端口转发)。 -
mangle
用于对特定数据包的修改(参考 损坏数据包)。
大部分情况仅需要使用 filter 和 nat。其他表用于更复杂的情况——包括多路由和路由判定——已经超出了本文介绍的范围。
表名 | 作用简述 | 默认加载? | 常用场景 |
---|---|---|---|
filter | 默认表,用于控制访问(防火墙) | ✅ 是 | 拒/放行某些 IP/端口 |
nat | 用于地址转换(如端口映射) | ✅ 是 | DNAT/SNAT |
mangle | 修改报文内容(如 TTL、TOS、mark) | ❌ 否 | QoS、流量标记 |
raw | 跳过连接跟踪,加速数据包处理 | ❌ 否 | 配合 conntrack 使用 |
security | 用于 SELinux 的访问控制 | ❌ 否 | 安全模块控制 |
链 Chains
-
INPUT
: 输入链,发往本机的数据包通过此链。 -
OUTPUT
: 输出链,从本机发出的数据包通过此链。 -
FORWARD
: 转发链,本机转发的数据包通过此链。 -
PREROUTING
: 路由前链,在处理路由规则前通过此链,通常用于目的地址转换(DNAT)。 -
POSTROUTING
: 路由后链,完成路由规则后通过此链,通常用于源地址转换(SNAT)。
表包含的链
表名 | 包含的链(Chains) |
---|---|
filter | INPUT 、OUTPUT 、FORWARD |
nat | PREROUTING 、INPUT 、OUTPUT 、POSTROUTING |
mangle | PREROUTING 、INPUT 、FORWARD 、OUTPUT 、POSTROUTING |
raw | PREROUTING 、OUTPUT |
security | INPUT 、OUTPUT 、FORWARD (仅用于与 SELinux 集成的访问控制) |
链存在于的表
链名称 | 所在表(Tables) |
---|---|
PREROUTING | raw , mangle , nat |
INPUT | mangle , filter , security |
FORWARD | mangle , filter , security |
OUTPUT | raw , mangle , nat , filter , security |
POSTROUTING | mangle , nat |