一、iptables 是什么

iptables 是 Linux 系统中最经典的防火墙工具,它实际上是 Netfilter 框架的用户态配置接口。 Netfilter 是 Linux 内核中的数据包过滤框架,在网络协议栈的关键位置设置了"钩子"(hook), iptables 通过在这些钩子上挂载规则来实现数据包的过滤、修改和转发。

💡 版本说明

iptables 是 IPv4 的防火墙工具,对应 IPv6 的工具是 ip6tables。在现代 Linux 发行版中,nftables 作为 iptables 的继任者正在逐步普及,但 iptables 的概念和使用方式仍然是网络管理的基础技能。

二、核心概念:四表五链

iptables 的规则组织结构由表(Table)链(Chain)构成。 表定义了规则的用途(做什么),链定义了规则应用的时机(何时做)。

四种表(按优先级从高到低)

表名 功能 内核模块
raw 在连接跟踪之前处理数据包,可设置 NOTRACK 标记跳过连接跟踪 iptable_raw
mangle 修改数据包的特定字段(TTL、TOS、MARK 等) iptable_mangle
nat 网络地址转换(SNAT、DNAT、MASQUERADE) iptable_nat
filter 数据包过滤(ACCEPT、DROP、REJECT),最常用的表 iptable_filter

五种链

链名 触发时机 所属表
PREROUTING 数据包进入网卡后、路由决策前 raw, mangle, nat
INPUT 数据包目标地址是本机,路由决策后 mangle, nat, filter
FORWARD 数据包需要经过本机转发到其他主机 mangle, filter
OUTPUT 本机产生的数据包,路由决策后、发出前 raw, mangle, nat, filter
POSTROUTING 数据包即将离开网卡前 mangle, nat

三、数据包在 Netfilter 中的完整路径

下图展示了一个数据包从进入网卡到离开本机的完整路径,以及经过的各个链:

Netfilter 数据包流向图 数据包 进入网卡 PREROUTING raw→mangle→nat 路由 决策 目标 = 本机 INPUT mangle→filter 本机进程 (应用程序) OUTPUT raw→mangle→nat→filter 路由 决策 需转发 FORWARD mangle→filter POSTROUTING mangle→nat 数据包离开网卡 路径说明 蓝色: 发往本机 红色: 转发路径 橙色: NAT相关链 青色: 本机发出
图 1 — 数据包在 Netfilter 钩子中的完整流向,包含三条路径:入站、转发、出站

四、规则匹配与动作

每条 iptables 规则由匹配条件动作(Target)组成。数据包按规则顺序逐一匹配,一旦匹配成功则执行对应动作并停止继续匹配。

常用匹配条件

条件说明示例
-s源 IP 地址-s 192.168.1.0/24
-d目的 IP 地址-d 10.0.0.1
-p协议类型-p tcp
--sport源端口--sport 80
--dport目的端口--dport 443
-i入站网卡-i eth0
-o出站网卡-o eth1
-m state连接状态-m state --state ESTABLISHED

常用动作(Target)

动作说明
ACCEPT允许数据包通过
DROP丢弃数据包,不给发送方任何响应
REJECT丢弃数据包,并向发送方返回 ICMP 错误消息
SNAT修改源 IP 地址(出站 NAT)
DNAT修改目的 IP 地址(入站 NAT / 端口转发)
MASQUERADE动态 SNAT,适用于动态获取 IP 的场景(如拨号上网)
LOG记录日志(不终止规则匹配)

五、常用配置示例

1. 查看现有规则

# 查看指定表的所有规则(-L 列出,-n 不解析DNS,-v 详细信息)
iptables -t filter -L -n -v --line-numbers

# 查看各表的规则计数
iptables -t nat -L -n
iptables -t mangle -L -n

2. 基础防火墙配置

# 清除所有现有规则
iptables -F
iptables -t nat -F
iptables -t mangle -F

# 设置默认策略:允许出站,拒绝入站和转发
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许回环接口
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 允许已建立连接的数据包通过(状态跟踪)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许 SSH(22)、HTTP(80)、HTTPS(443)入站
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 允许 ICMP(ping)
iptables -A INPUT -p icmp -j ACCEPT

3. NAT 配置:端口转发

# 将外部访问 80 端口的流量转发到内网 192.168.1.100:8080
iptables -t nat -A PREROUTING -p tcp --dport 80 \
    -j DNAT --to-destination 192.168.1.100:8080

# 对转发的数据包做 SNAT,使回包能正确路由回来
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.100 \
    --dport 8080 -j SNAT --to-source 192.168.1.1

# 开启 IP 转发功能(内核参数)
echo 1 > /proc/sys/net/ipv4/ip_forward

4. 防止 SYN 洪水攻击

# 限制每秒新 SYN 包数量(每秒最多 10 个,突发 20 个)
iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
⚠️ 注意事项

1. iptables 规则即时生效,重启后丢失。持久化需使用 iptables-save > /etc/sysconfig/iptables(CentOS)或安装 iptables-persistent 包(Ubuntu)。
2. 配置防火墙时务必保留 SSH 访问权限,否则可能被锁在服务器外面。
3. -A 是追加到链尾,-I 是插入到链首。规则按顺序匹配,注意先后顺序。

六、规则管理操作

# 添加规则到链尾
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

# 插入规则到指定位置(第1条)
iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT

# 删除指定规则(按行号)
iptables -D INPUT 3

# 删除指定规则(按规则内容)
iptables -D INPUT -p tcp --dport 8080 -j ACCEPT

# 替换规则
iptables -R INPUT 2 -p tcp --dport 22 -j ACCEPT

# 保存与恢复规则
iptables-save > /etc/sysconfig/iptables
iptables-restore < /etc/sysconfig/iptables
✅ 总结

理解 iptables 的关键在于掌握"数据包从哪来、到哪去、经过哪些链"这一思维模型。画一张数据包流向图,标出你的规则挂在哪个链的哪个位置,就能快速判断规则是否生效以及排查问题。