iptables 防火墙核心知识梳理(附实操指南)
目录
一、核心概念:Netfilter 与 iptables 的关系
二、核心结构:四表五链(规则的组织方式)
2.1 四表:按规则功能划分
2.2 五链:按数据包处理时机划分
2.3 数据包流转流程(核心必记)
三、实操基础:安装与基本语法
3.1 安装 iptables(CentOS 7 环境)
3.2 基本语法格式
3.3 常用控制类型(动作)
四、核心操作:规则的增删改查与默认策略
4.1 查看规则(高频)
4.2 添加规则(高频)
示例:
4.3 删除 / 清空规则
1. 删除单条规则(2 种方式)
2. 清空规则(-F)
4.4 设置默认策略(-P)
五、规则匹配条件(核心:精准过滤)
5.1 通用匹配(无需额外模块,直接使用)
示例:
5.2 隐含匹配(依赖 -p 协议,无需额外模块)
1. 端口匹配(tcp/udp 协议专用)
示例:
2. ICMP 类型匹配(icmp 协议专用)
5.3 显式匹配(需通过 -m 模块 明确指定)
1. 多端口匹配(-m multiport)
2. IP 范围匹配(-m iprange)
3. 状态匹配(-m state,高频且重要)
示例:仅允许已建立 / 相关连接的入站流量(生产环境推荐)
六、实操误区与注意事项(总结)
一、核心概念:Netfilter 与 iptables 的关系
iptables
并非独立防火墙,而是 Netfilter(内核态)+ iptables(用户态) 的组合体系,二者分工明确:
组件 | 工作空间 | 作用 | 运维关注点 |
---|---|---|---|
Netfilter | 内核态 | 集成于 Linux 内核,提供数据包过滤、地址转换、标记等底层功能,是规则的 “执行者” | 无需直接操作 |
iptables | 用户态 | 命令行工具,用于管理 Netfilter 的规则(增 / 删 / 改 / 查),是规则的 “管理者” | 核心操作对象 |
注:
iptables
本质是 “规则管理工具”,所有规则最终由内核的 Netfilter 生效,且规则配置后立即生效,无需重启服务。
二、核心结构:四表五链(规则的组织方式)
iptables
通过 “表(功能分类)→ 链(时机分类)→ 规则(具体动作)” 的层级结构管理数据包,需先理解 “四表”“五链” 的定位和优先级。
2.1 四表:按规则功能划分
四表优先级:raw → mangle → nat → filter
(数据包会按此顺序经过不同表的处理)
表名 | 核心功能 | 包含链 | 应用场景 |
---|---|---|---|
raw | 关闭数据包的状态跟踪(仅对需要跳过跟踪的场景使用,如高并发服务) | PREROUTING、OUTPUT | 极少用 |
mangle | 修改数据包标记(如给数据包打标签,用于后续流量整形) | 五链全包含(INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING) | 流量控制、QoS 相关 |
nat | 网络地址转换(修改源 / 目的 IP / 端口) | PREROUTING(DNAT)、OUTPUT、POSTROUTING(SNAT) | 内网访问公网(SNAT)、公网访问内网服务(DNAT) |
filter | 数据包过滤(允许 / 拒绝 / 丢弃) | INPUT(入站)、OUTPUT(出站)、FORWARD(转发) | 最常用,主机 / 网络防火墙核心 |
重点:日常运维中 filter 表(过滤) 和 nat 表(地址转换) 是高频操作对象,raw/mangle 表极少涉及。
2.2 五链:按数据包处理时机划分
“链” 是数据包在流转过程中 “必经的检查点”,不同链对应不同的处理阶段:
链名 | 处理时机 | 典型场景 |
---|---|---|
PREROUTING | 数据包进入内核后,路由选择前(先修改地址,再决定发往哪里) | DNAT(公网→内网服务地址映射) |
INPUT | 数据包目标地址是本机,路由选择后进入本机应用前 | 控制外部访问本机服务(如 SSH、Web) |
FORWARD | 数据包需经过本机转发(目标地址非本机),路由选择后转发前 | 网络防火墙(如路由器转发控制) |
OUTPUT | 本机应用发送的数据包,路由选择前 | 控制本机访问外部服务(极少配置) |
POSTROUTING | 数据包转发 / 出站前,路由选择后(最后一步修改地址) | SNAT(内网→公网地址伪装) |
2.3 数据包流转流程(核心必记)
不同场景下,数据包会经过不同的 “链”,这是编写规则的前提:
-
主机型防火墙(数据包目标是本机)
入站:PREROUTING → 路由选择 → INPUT → 本机应用
出站:本机应用 → OUTPUT → 路由选择 → POSTROUTING
-
网络型防火墙(数据包需转发)
转发:PREROUTING → 路由选择 → FORWARD → POSTROUTING
三、实操基础:安装与基本语法
3.1 安装 iptables(CentOS 7 环境)
CentOS 7 默认用 firewalld
,需先关闭并替换为 iptables
:
# 1. 关闭 firewalld 并禁止开机启动
systemctl stop firewalld
systemctl disable firewalld# 2. 安装 iptables 及服务管理工具
yum -y install iptables iptables-services# 3. 启动 iptables 并设置开机启动
systemctl start iptables
systemctl enable iptables
3.2 基本语法格式
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
字段 | 说明 | 注意事项 |
---|---|---|
-t 表名 | 指定操作的表(默认 filter 表) | 不指定则默认操作 filter 表 |
管理选项 | 规则操作(如 -A 追加、-I 插入、-D 删除、-L 查看、-P 设置默认策略) | 选项需大写(如 -A 而非 -a ) |
链名 | 指定操作的链(如 INPUT、POSTROUTING) | 不指定则操作表内所有链 |
匹配条件 | 数据包的特征(如源 IP、端口、协议) | 除默认策略外,必须指定匹配条件 |
-j 控制类型 | 匹配后的动作(如 ACCEPT、DROP) | 动作需大写 |
3.3 常用控制类型(动作)
控制类型 | 作用 | 区别与场景 |
---|---|---|
ACCEPT | 允许数据包通过 | 正常放行合法流量 |
DROP | 直接丢弃数据包,不回复任何信息 | 隐蔽性强(如防扫描),不推荐对普通服务使用 |
REJECT | 拒绝数据包,回复 “不可达” 信息 | 明确告知对方 “被拒绝”,适合普通过滤场景 |
LOG | 记录日志(/var/log/messages),不影响数据包流转(需配合其他动作) | 用于审计或排查问题 |
SNAT | 修改数据包源地址(如内网 IP → 公网 IP) | 内网共享公网出口 |
DNAT | 修改数据包目的地址(如公网 IP → 内网服务 IP) | 公网访问内网服务(如 Web、数据库) |
MASQUERADE | 动态 SNAT(适用于公网 IP 不固定的场景,如拨号上网) | 路由器 / 网关常用 |
四、核心操作:规则的增删改查与默认策略
4.1 查看规则(高频)
命令 | 作用 |
---|---|
iptables -L [链名] | 查看指定链的规则(默认 filter 表,地址显示为域名 / 服务名) |
iptables -nL [链名] | 数字形式显示(IP 为 0.0.0.0/0 而非 anywhere,端口为数字) |
iptables -vnL [链名] --line-numbers | 显示详细信息(包数、字节数)+ 规则序号(删除 / 修改规则必备) |
iptables -t nat -L | 查看 nat 表的规则 |
示例:查看 filter 表 INPUT 链的详细规则(带序号)
iptables -vnL INPUT --line-numbers
4.2 添加规则(高频)
-A 链名
:在链的末尾追加规则(按顺序匹配,末尾优先级最低)-I 链名 [序号]
:在链的指定位置插入规则(默认插入到第 1 位,优先级最高)
示例:
- 禁止所有主机 ping 本机(ICMP 协议,filter 表 INPUT 链末尾追加)
iptables -A INPUT -p icmp -j REJECT
- 允许 192.168.80.0/24 网段访问本机 SSH(22 端口,插入到 INPUT 链第 1 位)
iptables -I INPUT 1 -s 192.168.80.0/24 -p tcp --dport 22 -j ACCEPT
4.3 删除 / 清空规则
1. 删除单条规则(2 种方式)
- 按规则序号删除(推荐,需先通过
--line-numbers
查看序号)# 删除 filter 表 INPUT 链的第 3 条规则 iptables -D INPUT 3
- 按规则内容删除(需完全匹配)
# 删除“拒绝 ICMP 协议”的规则 iptables -D INPUT -p icmp -j REJECT
2. 清空规则(-F
)
# 清空 filter 表所有链的规则(默认表)
iptables -F# 清空 nat 表所有链的规则
iptables -t nat -F# 清空 filter 表 INPUT 链的规则
iptables -F INPUT
警告:
-F
仅清空规则,不影响默认策略(如 INPUT 链默认策略为 DROP 时,清空后仍会拒绝所有入站流量);- 若默认策略为 DROP,清空规则前务必保留 SSH 允许规则(否则会导致远程连接断开,需物理机恢复)。
4.4 设置默认策略(-P
)
默认策略是 “所有规则都不匹配时” 的最终动作,仅支持 ACCEPT
或 DROP
:
# 设置 filter 表 INPUT 链默认策略为 DROP(拒绝所有未匹配的入站流量)
iptables -P INPUT DROP# 设置 filter 表 FORWARD 链默认策略为 DROP(网络防火墙常用,拒绝默认转发)
iptables -P FORWARD DROP# 设置 filter 表 OUTPUT 链默认策略为 ACCEPT(允许本机出站流量)
iptables -P OUTPUT ACCEPT
生产环境推荐:默认策略设为 DROP,再通过 “白名单” 放行合法流量(最小权限原则,更安全)。
五、规则匹配条件(核心:精准过滤)
匹配条件是规则的 “筛选器”,只有符合条件的数据包才会执行指定动作。分为三类:通用匹配、隐含匹配、显式匹配。
5.1 通用匹配(无需额外模块,直接使用)
匹配条件 | 说明 | 示例 |
---|---|---|
-p 协议 | 匹配数据包协议(tcp/udp/icmp/all) | -p tcp (匹配 TCP 协议) |
-s 源地址 | 匹配数据包源 IP / 网段(! -s 表示 “非”) | -s 192.168.80.10 (匹配源 IP 为 10 的主机) |
-d 目的地址 | 匹配数据包目的 IP / 网段 | -d 192.168.80.0/24 (匹配目的网段) |
-i 入站网卡 | 匹配数据包流入的网卡(如 ens33) | -i ens33 (仅匹配从 ens33 网卡进来的流量) |
-o 出站网卡 | 匹配数据包流出的网卡 | -o ens37 (仅匹配从 ens37 网卡出去的流量) |
示例:
拒绝 192.168.80.10 主机通过 ens33 网卡访问本机 TCP 服务:
iptables -A INPUT -i ens33 -s 192.168.80.10 -p tcp -j REJECT
5.2 隐含匹配(依赖 -p 协议
,无需额外模块)
需先指定 -p 协议
(如 tcp/udp/icmp),再使用对应的端口、标记等匹配条件。
1. 端口匹配(tcp/udp 协议专用)
匹配条件 | 说明 | 示例 |
---|---|---|
--sport 源端口 | 匹配源端口(支持单个端口、范围:1000:3000 、:3000 (≤3000)、1000: (≥1000)) | -p tcp --sport 22 (匹配源端口 22) |
--dport 目的端口 | 匹配目的端口 | -p tcp --dport 80 (匹配目的端口 80,即 Web 服务) |
示例:
允许所有主机访问本机的 FTP(20/21 端口)和 Web(80 端口)服务:
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
2. ICMP 类型匹配(icmp 协议专用)
ICMP 类型(字符串 / 代码) | 含义 | 示例 |
---|---|---|
Echo-Request(8) | ping 请求(对方 ping 本机) | -p icmp --icmp-type 8 -j DROP (禁止 ping) |
Echo-Reply(0) | ping 回复(本机 ping 对方) | -p icmp --icmp-type 0 -j ACCEPT (允许回复) |
5.3 显式匹配(需通过 -m 模块
明确指定)
需额外加载扩展模块(-m 模块名
),支持更复杂的匹配(如多端口、IP 范围、状态)。
1. 多端口匹配(-m multiport
)
一次匹配多个端口(避免重复写多条规则):
# 允许访问本机的 22(SSH)、80(Web)、21(FTP)、53(DNS)端口(TCP 协议)
iptables -A INPUT -p tcp -m multiport --dport 22,80,21,53 -j ACCEPT
2. IP 范围匹配(-m iprange
)
匹配连续的 IP 范围:
# 拒绝 192.168.80.100-192.168.80.200 范围的主机访问本机(UDP 协议)
iptables -A INPUT -p udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j REJECT
3. 状态匹配(-m state
,高频且重要)
基于 TCP 连接状态 匹配,是 “智能过滤” 的核心(避免放行无效连接):
连接状态 | 含义 |
---|---|
NEW | 新连接请求(如首次发起的 SSH 握手) |
ESTABLISHED | 已建立的连接(如 SSH 连接成功后的数据传输) |
RELATED | 与已建立连接相关的连接(如 FTP 被动模式的数据连接) |
INVALID | 无效连接(如伪造的数据包) |
示例:仅允许已建立 / 相关连接的入站流量(生产环境推荐)
# 允许已建立连接或相关连接的 TCP 流量(避免重复放行后续数据包)
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT# 仅允许新的 SSH 连接请求(配合上面的规则,实现“只放行合法 SSH 连接”)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT# 设置 INPUT 链默认策略为 DROP(拒绝所有未匹配的流量)
iptables -P INPUT DROP
六、实操误区与注意事项(总结)
- 规则顺序影响生效结果:链内规则按 “自上而下” 匹配,匹配即停止(LOG 除外)。例如:若 “拒绝所有 TCP 流量” 的规则在 “允许 SSH 流量” 之前,SSH 规则会失效。
- 默认策略为 DROP 时的风险:设置
iptables -P INPUT DROP
后,务必先放行 SSH(22 端口)和必要服务,否则远程连接会直接断开。 - 规则不持久化的问题:
iptables
规则默认保存在内存中,重启后会丢失。需执行service iptables save
或iptables-save > /etc/sysconfig/iptables
保存到配置文件。 - 区分 SNAT 与 DNAT:
- SNAT(POSTROUTING 链):内网→公网(修改源 IP);
- DNAT(PREROUTING 链):公网→内网(修改目的 IP)。
通过以上梳理,你可以快速掌握 iptables
的核心逻辑和实操方法。建议结合实际场景练习(如搭建主机防火墙、配置内网 NAT 转发),加深对 “表链结构” 和 “匹配流程” 的理解。