iptables通过-m conntrack模块匹配established、related、new、invalid四类连接状态实现有状态过滤,核心规则为先放行established,related,再按需允许特定new连接,最后drop invalid及其他未匹配包。

直接用 iptables 的 -m state(或更现代的 -m conntrack)模块,配合预设连接状态,就能让防火墙“记住”通信上下文,只放行合法的响应和后续数据包,而不是对每个包做孤立判断。这是构建动态过滤的核心机制。
理解连接状态的四种关键类型
iptables 本身不维护状态,而是依赖内核的连接跟踪子系统(conntrack),它把每个连接抽象为以下四种状态:
- NEW:数据包发起一个全新连接(如客户端第一次发 SYN)
- ESTABLISHED:属于已建立连接的后续包(如服务器回 SYN-ACK 后,双方的正常数据流)
- RELATED:与现有连接逻辑相关的新连接(如 FTP 的数据连接、ICMP 错误报文对应原始 TCP 连接)
- INVALID:无法归类到任何已有连接,或连接跟踪信息损坏(通常应 DROP)
基础规则链中必须加入的状态匹配
在 filter 表的 INPUT 链里,典型的安全顺序是:
- 先允许所有 ESTABLISHED,RELATED 流量 —— 这是动态防火墙的基石
- 再按需放行特定 NEW 连接(如 SSH、HTTP)
- 最后默认拒绝(DROP)其余 NEW 或 INVALID 包
命令示例:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTiptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
注意模块命名与内核兼容性
旧版内核(-m state --state ESTABLISHED;新版推荐使用 -m conntrack --ctstate,功能更完整、语义更清晰。两者效果一致,但 conntrack 模块支持更多匹配项(如 --ctorigsrc、--ctstatus)。
确认模块可用:
lsmod | grep nf_conntrackmodprobe nf_conntrack
避免常见陷阱
- 不要把 ESTABLISHED,RELATED 规则放在链末尾 —— 必须靠前,否则新连接还没被允许就已被前面的 DROP 截断
- ICMP 不需要显式放行 RELATED,但若需 ping,仍要单独加
-p icmp -j ACCEPT(因 ping 属于 NEW) - 启用连接跟踪后,注意 conntrack 表满会导致丢包,可调大上限:
sysctl -w net.netfilter.nf_conntrack_max=65536 - 规则持久化需保存(如
iptables-save > /etc/sysconfig/iptables),否则重启丢失











