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 save

CentOS / RHEL

# 需先停用 firewalld
systemctl stop firewalld && systemctl disable firewalld
yum install -y iptables-services
systemctl enable iptables
service iptables save

UFW 还是 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(重置默认策略为允许)。清空前确认不会锁死自己。