iptables是Linux内核netfilter框架上的无守护进程包过滤工具,由filter、nat、mangle、raw四表及五链构成,规则按链顺序匹配,filter表INPUT/OUTPUT链最常用,需手动保存持久化。

iptables 是 Linux 系统中经典且功能强大的包过滤防火墙工具,掌握基础规则编写能帮你快速实现主机级访问控制、端口限制和流量审计。它不依赖守护进程,规则直接运行在内核 netfilter 框架中,生效快、开销低。
理解 iptables 的四表五链结构
iptables 并非“一张表”,而是由 filter、nat、mangle、raw 四个规则表组成,各自承担不同职责:
- filter 表:默认表,专用于包过滤(如 ACCEPT、DROP),含 INPUT、FORWARD、OUTPUT 三条链
- nat 表:负责网络地址转换,典型用于 SNAT(出口修改源地址)、DNAT(入口修改目标地址),含 PREROUTING、POSTROUTING、OUTPUT 链
- mangle 表:用于修改包头字段(如 TTL、TOS),较少日常使用
- raw 表:用于绕过连接跟踪(NOTRACK),常配合高并发服务优化
每条链代表数据包在网络栈中的一个处理节点。例如:外部请求进入本机时,依次经过 PREROUTING → INPUT;本机发出的请求则走 OUTPUT → POSTROUTING。写规则前先确认目标表和链,避免规则不生效。
常用 filter 表规则编写与实战示例
绝大多数安全策略集中在 filter 表的 INPUT 和 OUTPUT 链。以下为高频操作(以 root 或 sudo 执行):
- 清空现有规则:iptables -F(谨慎!建议先备份:iptables-save > /root/iptables.bak)
- 设置默认策略(推荐先设为 ACCEPT,调试完成再收紧):iptables -P INPUT ACCEPT
- 允许本地回环通信:iptables -A INPUT -i lo -j ACCEPT
- 允许已建立连接的返回流量:iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
- 开放 SSH(端口 22)并限制来源 IP(如仅允 192.168.1.0/24 网段):iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
- 拒绝所有其他入站请求:iptables -A INPUT -j DROP(放在最后,确保前面规则已覆盖合法流量)
注意:-A 表示追加到链尾,-I 表示插入到链首(如 iptables -I INPUT 1 -p icmp --icmp-type echo-request -j ACCEPT 可优先放行 ping)。
保存与持久化规则
iptables 规则默认不跨重启保存。不同发行版方式略有差异:
- Debian/Ubuntu:iptables-save > /etc/iptables/rules.v4,并确保 netfilter-persistent 服务已启用
- RHEL/CentOS 7+:iptables-save > /etc/sysconfig/iptables,启用 iptables 服务(systemctl enable iptables)
- 通用兼容方案:将规则写入脚本(如 /usr/local/bin/iptables-init.sh),通过 systemd service 或 rc.local 调用
务必验证重启后规则是否加载成功:iptables -L -n -v 查看计数器是否增长,确认策略实际生效。
排查与调试技巧
规则不生效?常见原因包括链顺序错误、协议/端口写错、状态匹配未启用、或被更高优先级表(如 nat)干扰:
- 查看详细规则及匹配计数:iptables -L INPUT -n -v(观察 pkts 列是否增加)
- 临时记录被丢弃的包(用于诊断):iptables -I INPUT -j LOG --log-prefix "IPBLOCK: ",日志通常输出到 /var/log/messages 或 journalctl -k
- 检查是否启用 conntrack 模块:lsmod | grep nf_conntrack,缺失时需 modprobe nf_conntrack
- 确认网卡名和方向:-i(入接口)与 -o(出接口)勿混淆,如 docker 容器通信常涉及 docker0 接口
不复杂但容易忽略。规则越精简越可靠,宁可多写几条明确规则,也不要依赖模糊匹配或过度依赖默认策略。










