iptables 是 Linux 内核内置的网络包过滤框架,是 UFW、firewalld 等高层工具的底层引擎。理解 iptables 的工作原理,不仅能让你在没有上层工具时独立配置防火墙,也有助于排查复杂的网络访问问题。本文带你掌握 iptables 的核心概念与常用规则。
本文要点
- iptables 表与链的概念与工作流程
- 放行、拒绝、丢弃数据包的规则写法
- 持久化保存规则,重启后依然生效
- iptables 与 UFW 的适用场景对比
核心概念:表与链
四张表(Table)
iptables 按功能划分为四张表,日常防火墙配置主要用 filter 表:
| 表名 | 用途 | 常用程度 |
|---|---|---|
| filter | 包过滤(放行 / 拒绝) | ★★★★★ |
| nat | 地址转换(端口转发等) | ★★★☆☆ |
| mangle | 数据包修改 | ★☆☆☆☆ |
| raw | 连接跟踪豁免 | ★☆☆☆☆ |
filter 表的三条链(Chain)
- INPUT:目的地是本机的入站流量
- OUTPUT:从本机发出的出站流量
- FORWARD:需经本机转发的流量(路由 / NAT 场景)
规则的匹配顺序
数据包进入链后,iptables 从第一条规则向下逐一比对,命中第一条匹配规则后立即执行动作(ACCEPT / DROP / REJECT),不再继续往下。若全部不匹配,执行链的默认策略(Policy)。
查看当前规则
# 查看 filter 表所有链(带行号、详细统计)
iptables -L -n -v --line-numbers
# 只看 INPUT 链
iptables -L INPUT -n -v --line-numbers放行与拒绝规则
放行已建立的连接(必须最先添加)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT # 本地回环必须放行放行 SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 自定义端口示例
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT放行 Web 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT设置默认策略(最后执行,执行前务必已放行 SSH)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT设默认 DROP 前务必放行 SSH
执行 iptables -P INPUT DROP 后,所有未被明确放行的端口立刻封闭。若 SSH 未提前放行,会立即断线且无法通过网络恢复——请通过 KiwiVM 紧急控制台操作。
DROP 与 REJECT 的区别
| 动作 | 行为 | 攻击者视角 | 适用场景 |
|---|---|---|---|
| ACCEPT | 放行数据包 | 正常通信 | 放行合法流量 |
| REJECT | 拒绝并返回错误 | 知道端口不可达 | 内部网络调试友好 |
| DROP | 静默丢弃 | 不知道是否存在 | 隐藏端口、抵御扫描 |
删除规则
# 按行号删除(先用 --line-numbers 查看编号)
iptables -D INPUT 3
# 按规则内容删除(把 -A 换成 -D)
iptables -D INPUT -p tcp --dport 80 -j ACCEPT持久化保存规则
iptables 规则默认只在内存中,重启后丢失。
Debian / Ubuntu
apt install -y iptables-persistent
# 安装时选择 Yes 保存现有规则
# 后续手动保存
netfilter-persistent saveCentOS / RHEL
# 需先停用 firewalld
systemctl stop firewalld && systemctl disable firewalld
yum install -y iptables-services
systemctl enable iptables
service iptables saveUFW 还是 iptables?
UFW 语法简洁、适合日常管理,是 Debian/Ubuntu 新手首选;iptables 功能更强,适合需要精细控制或在 CentOS/RHEL 上工作的进阶用户。生产环境选一套工具统一管理,不要混用。
小结
- iptables 分表(filter/nat/mangle/raw)和链(INPUT/OUTPUT/FORWARD)
- 规则从上到下逐一匹配,命中即停
- 设默认 DROP 前务必先放行 SSH 和回环接口
- DROP 比 REJECT 更隐蔽,适合对外端口
- 用 iptables-persistent(Debian)或 iptables-services(CentOS)持久保存规则
常见问题
iptables 规则重启后消失怎么办?
安装 iptables-persistent(Debian/Ubuntu)或 iptables-services(CentOS),将规则持久化到磁盘,重启后自动加载。
已经用了 UFW,还需要学 iptables 吗?
UFW 已能满足绝大多数场景。了解 iptables 有助于排查底层问题,或在没有 UFW 的系统上手动配置防火墙。
REJECT 和 DROP 哪个更安全?
对外网建议 DROP,静默丢弃不向外暴露信息;REJECT 会返回错误响应,攻击者能确认端口状态。
如何清空所有规则重来?
执行 iptables -F(清空规则)、iptables -X(删除自定义链)、iptables -P INPUT ACCEPT(重置默认策略为允许)。清空前确认不会锁死自己。