一、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 中的完整路径
下图展示了一个数据包从进入网卡到离开本机的完整路径,以及经过的各个链:
四、规则匹配与动作
每条 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 的关键在于掌握"数据包从哪来、到哪去、经过哪些链"这一思维模型。画一张数据包流向图,标出你的规则挂在哪个链的哪个位置,就能快速判断规则是否生效以及排查问题。