iptables通过conntrack模块实现状态检测,用-m conntrack --ctstate匹配NEW、ESTABLISHED、RELATED、INVALID等状态,结合DROP默认策略、INVALID包丢弃、速率限制和日志审计构建基础防护。

iptables 本身不直接提供“状态防火墙”功能,而是通过 conntrack(连接跟踪)模块 实现状态检测,从而识别并控制合法连接的后续数据包。防止非法包注入的关键,在于合理配置状态匹配规则,拒绝非正常连接发起或异常状态的数据包。
理解 iptables 的状态匹配机制
iptables 使用 -m conntrack --ctstate(旧版用 -m state --state,已弃用)来判断数据包所属连接的状态。常见状态包括:
- NEW:表示该包试图新建一个连接(如 TCP 的 SYN 包)
- ESTABLISHED:属于已成功建立的双向连接的数据包(如 SYN-ACK 后的 ACK、后续应用层数据)
- RELATED:与现有连接逻辑相关的新连接(如 FTP 的数据连接、ICMP 错误报文)
- INVALID:无法归类到任何已知连接,或连接状态异常(如无对应连接的 FIN/RST、伪造源端口/序列号等),这类包极可能是非法注入或扫描行为
基础防护策略:只放行合法状态流量
默认策略应为 DROP,再按需放行。典型入站规则链(INPUT)设置如下:
- 先放行已建立和关联连接:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - 再放行本机主动发起的出站连接返回包(依赖 conntrack 自动跟踪)
- 对新连接(NEW)做严格限制:仅允许特定服务端口(如 SSH、HTTP)且建议配合源 IP 限制或速率控制
-
务必在最后显式丢弃 INVALID 状态包:
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
增强防御:结合其他模块阻断常见注入手法
单纯依赖状态匹配不足以覆盖所有非法注入场景,建议补充以下措施:
- 使用
-m tcp --tcp-flags检查 TCP 标志位合理性(如拒绝 SYN+FIN 同时置位的畸形包) - 启用
nf_conntrack_tcp_be_liberal=1(谨慎)可放宽 TCP 状态校验,但可能降低对异常包的识别能力;生产环境建议保持默认保守模式 - 配合
-m limit限制 NEW 连接速率,缓解 SYN Flood 类攻击:-m conntrack --ctstate NEW -m limit --limit 3/minute --limit-burst 3 -j ACCEPT - 记录可疑 INVALID 包用于审计:
-m conntrack --ctstate INVALID -j LOG --log-prefix "INVALID_PACKET: ",再 DROP
验证与维护要点
规则生效后需持续确认其有效性:
- 检查连接跟踪表大小是否充足:
cat /proc/sys/net/netfilter/nf_conntrack_max,连接数多时需适当调大 - 查看当前跟踪条目:
conntrack -L | head -20,观察是否有大量异常或超时连接 - 定期清理老化连接:
echo 1 > /proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal非必要不开启;更推荐优化超时参数(如缩短nf_conntrack_tcp_timeout_established) - 保存规则(如使用
iptables-save > /etc/iptables/rules.v4),避免重启丢失










