Linux iptables防火墙基础知识总结
一、基本框架
iptables 是 Linux 系统中常用的防火墙工具,工作在用户空间,用来编写规则,基于内核的 netfilter 框架实现数据包的过滤、转换和修改。其核心框架由 “四表五链” 构成,规则的匹配和执行遵循特定顺序,同时支持自定义链以灵活管理规则。
二、iptables 中的链
“链” 是数据包流转过程中经过的检查点,每条链对应数据包处理的特定阶段,由内核自动创建,即内置链。对应内核中的每一个勾子函数 (INPUT,OUTPUT,FORWARD,PREROUTING,
POSTROUTING)。
除了内置链外,用户还可创建自定义链,用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有钩子函数调用自定义链时,才会生效,即需通过内置链的规则引用自定义链。
1、PREROUTING 链
数据包进入本机后,路由选择之前经过的链。用于提前修改数据包(如 DNAT),或标记数据包。即主机接收到数据是否是给我们的,是否要修改(ip或port),相当于进站安检。
2、INPUT 链
当路由判断数据包的目标地址是本机时,经过此链。用于控制哪些外部数据包可进入本机(如允许 SSH 连接)。即接收到的数据经过路由分析,是本机处理,相当与上车。
3、FORWARD 链
当路由判断数据包需要经过本机转发(本机既非源也非目标)时,经过此链。用于控制转发行为(如网关服务器的转发规则)。即接收到的数据经过路由分析,不是本机处理,本机只做转发,相当于转车。
4、OUTPUT 链
本机产生的数据包(如应用程序发送的请求)在离开本机前经过此链。用于控制本机对外发送的数据包。即本机处理完的数据经过路由分析,直接传输出去,相当于下车。
5、POSTROUTING 链
数据包经过路由选择后,离开本机前的最后一条链。用于修改源地址(如 SNAT,将内网地址转换为外网地址)。即数据传输出去的时候,是否需要修改(ip或port),相当于出站安检。
三、iptables 中的表
iptables 的表用于分类管理不同功能的规则,每个表关联特定的链,主要包括以下四类:filter、nat、mangle、raw。优先级从高到低依次是:raw > mangle > nat > filter。
1、filter 表(过滤规则表)
最常用的表,也是默认表,根据预定义的规则过滤符合条件的数据包,是防火墙的核心功能。仅关联 3 条链:INPUT、OUTPUT、FORWARD。
2、nat 表(地址转换表)
用于实现网络地址转换(NAT),包括源地址转换(SNAT)、目标地址转换(DNAT)等。关联 3 条链:PREROUTING(路由前修改目标地址)、POSTROUTING(路由后修改源地址)、OUTPUT(本机产生的数据包的地址转换)。
3、mangle 表(修改表)
修改数据标记位规则表,修改数据报文(修改数据包的元数据,如 TTL、服务类型、标记等),可辅助路由或过滤。关联所有 5 条链(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING)。
4、raw 表(原始表)
用于关闭 nat 表启用的连接跟踪机制,减少性能消耗,加快封包穿越防火墙速度,仅处理不需要追踪的数据包。关联 2 条链:PREROUTING、OUTPUT。
四、链表对应关系
| 表 | 可支持的链 | 
|---|---|
| raw | PREROUTING, OUTPUT | 
| mangle | PREROUTING, POSTROUTING, INPUT, OUTPUT, FORWARD | 
| nat | PREROUTING, POSTROUTING, INPUT, OUTPUT | 
| filter | INPUT, FORWARD, OUTPUT | 
五、数据包流转顺序
当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要传送出去;
如果数据包是进入本机的,则会进入INPUT链,然后交由本机的应用程序处理;
如果数据包是要转发的,且内核允许转发,则数据包在PREROUTING链之后到达FORWARD链,再经由POSTROUTING链输出
本机的应用程序往外发送数据包,会先进入OUTPUT链,然后到达POSTROUTING链输出
数据包的走向
数据流入,本机接收的数据包(目标是本机):PREROUTING 链(raw→mangle→nat)→ 路由判断(目标是本机)→ INPUT 链(mangle→filter)→ 进入本机应用程序。
数据流出,本机发出的数据包(源是本机):本机应用程序 → OUTPUT 链(raw→mangle→nat→filter)→ 路由选择 → POSTROUTING 链(mangle→nat)→ 离开本机。
数据转发,转发的数据包(经过本机转发):外部数据包 → PREROUTING 链(raw→mangle→nat)→ 路由判断(需要转发)→ FORWARD 链(mangle→filter)→ 路由选择 → POSTROUTING 链(mangle→nat)→ 离开本机。

六、规则匹配顺序
iptables 中,每条链内的规则按从上到下的顺序依次匹配:
当数据包匹配到某条规则时,会执行该规则的 “目标”(如 ACCEPT、DROP、跳转至其他链等),并停止后续规则的匹配(除非目标是 RETURN,会返回原链继续匹配)。
若数据包不匹配链中任何规则,则执行该链的 “默认策略”。
七、策略的设置方式
1、iptables命令组成
iptables 完整命令由以下部份组成:
iptables [-t Table] -子命令 <链> <规则策略> [动作]
即通过 iptables 命令,在某个表的某个链上设置某条过滤规则
字段说明
iptables:iptables命令
Table:具体要操作的表,用 -t 指定,raw|mangle|nat|filter,默认 filter
Chain:具体要操作的链,PREROUTING|INPUT|FORWARD|OUTPUT|POSTROUTING
Rule:具体规则,由匹配条件和目标组成,如果满足条件,就执行目标中的规则,目标用 -j 指定
动作:基本动作ACCEPT|DROP|RETURN
2、命令格式
指定表
-t|--table table #指定表 raw|mangle|nat|filter,如果不显式指定,默认是filter
操作链
-N|--new-chain chain #添加自定义新链
-X|--delete-chain [chain] #删除自定义链(要求链中没有规则)
-P|--policy chain target #设置默认策略,对filter表中的链而言,其默认策略有ACCEPT|DROP
-E|--rename-chain old-chain new-chain #重命名自定义链,引用计数不为0的自定义链不能被重命名
-L|--list [chain] #列出链上的所有规则
-S|--list-rules [chain] #列出链上的的有规则
-F|--flush [chain] #清空链上的所有规则,默认是所有链
-Z|--zero [chain [rulenum]] #置0,清空计数器,默认操作所有链上的所有规则
操作具体规则
-A|--append chain rule-specification #往链上追加规则
-I|--insert chain [rulenum] rule-specification #往链上插入规则,可以指定编号,默认插入到最前面
-C|--check chain rule-specification #检查链上的规则是否正确
-D|--delete chain rule-specification #删除链上的规则
-D|--delete chain rulenum #根据编号删除链上的规则
-R|--replace chain rulenum rule-specification #根据链上的规则编号,使用新的规则替换原有规则
其它选项
-h|--help #显示帮助
-V|--version #显示版本
-v|--verbose #显示详细信息
-n|--numeric #以数字形式显示IP和端口,默认显示主机名和协议名,否则容易遭受hosts解析影响
--line-numbers #显示每条规则编号
-j|--jump # 决定了数据包在满足特定条件后的命运。ACCEPT:允许数据包通过。DROP:丢弃数据包,不给出任何回应。等客户端测试多次后,主动放弃。REJECT:直接拒绝数据包,并向发送方发送一个错误响应。
查看规则选项
-L #显示规则条目,后面可以接需要查看的链,不写的话表示所有链。如果规则不为空,单独 -L 选项显示时有可能会很慢,这是因为需要对主机名和服务名进行反解导致的,
-n #选项查看规则的时候 主机名和端口不做解析,介于此,可以实现规避上面的问题。
-v #显示详细信息
--line-numbers #显示规则的标号
-S #打印规则,编写命令给我们打印出来,方便我们去学习
-t #指定查看的表
3、默认策略
默认策略(Policy)是当数据包不匹配链中任何规则时的默认处理行为,仅适用于内置链(自定义链无默认策略)。
设置命令
iptables -P 链名 策略常用策略:ACCEPT(允许通过)、DROP(直接丢弃,不返回任何信息)、REJECT(拒绝并返回错误信息)。
示例
# 设置 INPUT 链默认拒绝所有未匹配的数据包
iptables -P INPUT DROP注:默认规则(iptables -P)是 ACCEPT,不建议修改,容易出现 “自杀” 现象。
4、常见策略
设置命令
# 在第1行插入一条规则
iptables -t 表名 -I 链名 策略# 在原来规则后面去追加
iptables -t 表名 -A 链名 策略
常用策略:ACCEPT(允许通过)、DROP(直接丢弃,不返回任何信息)、REJECT(拒绝并返回错误信息)。
示例
# 在INPUT 链的 filter 表上设置过滤规则,将来自 10.0.0.112 的数据包丢弃掉
iptables -t filter -A INPUT -s 10.0.0.12 -j DROP八、自定义链配置
1、创建自定义链
创建命令
iptables -N 自定义链名示例
# 创建一个名为NGINX_RULES的自定义链
iptables -N NGINX_RULES2、使用自定义链
需通过内置链的规则引用自定义链(目标为自定义链名),数据包匹配到该规则时会跳转到自定义链处理。
示例
# 示例:在 INPUT 链中添加规则,将所有 TCP 80 端口的数据包跳转至 NGINX_RULES 链处理
iptables -A INPUT -p tcp --dport 80 -j NGINX_RULES注:自定义链中若规则匹配,按目标处理;若不匹配,会返回原链继续匹配后续规则。
3、删除自定义链
删除前需满足以下两个条件:
自定义链中无任何规则(需先清空);
无其他链的规则引用该自定义链(需先删除引用)。
示例
# 清空自定义链的规则
iptables -F NGINX_RULES # 删除引用该链的规则(如 INPUT 链中指向 NGINX_RULES 的规则)
iptables -D INPUT -p tcp --dport 80 -j NGINX_RULES # 删除自定义链
iptables -X NGINX_RULES 