iptables状态防火墙核心是基于conntrack模块跟踪连接状态,通过new/established/related/invalid四类状态精准控制数据包,优先drop invalid和非法new包,再accept established/related,配合raw表notrack优化性能,并定期监控清理异常连接。

iptables 的状态防火墙(stateful firewall)核心在于跟踪连接状态,只允许合法、有上下文的数据包通过,从而有效阻挡伪造源地址、无连接的非法注入包。关键不是简单封端口,而是识别“这个包是否属于一个真实建立的会话”。
理解 conntrack 状态是基础
iptables 本身不维护连接状态,依赖内核模块 nf_conntrack(旧版叫 ip_conntrack)来记录连接信息。每个数据包进入时,内核会查询该表,打上如下状态标签:
- NEW:发起新连接的第一个包(如 TCP SYN)
- ESTABLISHED:属于已建立连接的后续双向通信包(如 SYN-ACK、ACK 后的数据)
- RELATED:与现有连接逻辑相关的新连接(如 FTP 数据连接、ICMP 错误响应)
- INVALID:无法归类、校验失败或无对应连接记录的包——这类就是典型非法注入目标
默认策略应拒绝 INVALID 和 NEW 的无序包
在 INPUT 链中,优先匹配并显式丢弃高风险包,避免它们触发后续规则:
- -A INPUT -m conntrack --ctstate INVALID -j DROP(立即终止异常包)
- -A INPUT -m conntrack --ctstate NEW -i eth0 ! -s 192.168.1.0/24 -j DROP(限制仅内网可发起新连接,外网不能主动连你服务)
- 再放行 ESTABLISHED,RELATED:-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
注意:顺序很重要,必须把 DROP INVALID 放在最前,否则某些畸形包可能绕过检测。
配合原始表(raw)提前关闭连接跟踪
对明确不需要状态检查的流量(如高并发 UDP 日志、健康探测),可在 raw 表中用 NOTRACK 跳过 conntrack,既提升性能,也避免无效连接记录挤占内存:
- -t raw -A PREROUTING -p udp --dport 514 -j NOTRACK
- -t raw -A OUTPUT -p icmp --icmp-type 8 -j NOTRACK(禁用 ping 的状态跟踪)
这样它们就不会出现在 conntrack 表里,后续 filter 表规则也不用为它们做状态判断。
定期监控和清理异常连接
非法注入常表现为大量半开连接或短命 INVALID 包。用以下命令及时发现:
- conntrack -L | head -20 查看当前连接跟踪条目
- conntrack -L -s 203.0.113.45 检查某 IP 的所有连接状态
- conntrack -D --ctstate INVALID 清理全部无效条目(可加入 cron 定期执行)
若发现某 IP 持续产生 NEW 但无后续 ESTABLISHED,大概率是扫描或伪造包,可配合 ipset 封禁。
状态防火墙不是万能,但它让攻击者无法靠单个伪造包直接触达服务。真正起效的前提是合理设置默认拒绝策略,并始终信任 ESTABLISHED/RELATED,质疑一切 NEW 和 INVALID。










