iptables状态检测基于conntrack模块,通过NEW/ESTABLISHED/RELATED/INVALID状态匹配实现连接跟踪,需加载nf_conntrack及协议子模块、启用sysctl参数,并配合rp_filter、分片过滤、TCP标志检查等增强防护。

iptables 的状态检测(stateful inspection)机制基于 conntrack 模块,通过跟踪连接的生命周期(如 NEW、ESTABLISHED、RELATED、INVALID)来判断数据包是否合法。正确配置可有效拦截伪造源地址、非响应性回包、分片攻击等非法注入行为。
启用并验证 conntrack 模块
状态匹配依赖内核模块 nf_conntrack 及协议子模块(如 nf_conntrack_ipv4)。需确保其已加载:
- 运行
lsmod | grep nf_conntrack查看是否加载;若无输出,执行modprobe nf_conntrack和modprobe nf_conntrack_ipv4 - 检查 sysctl 是否启用连接跟踪:
sysctl net.netfilter.nf_conntrack_enable应为 1;若为 0,临时启用:sysctl -w net.netfilter.nf_conntrack_enable=1 - 持久化设置可写入
/etc/sysctl.conf,避免重启失效
基础状态规则链设计(以 INPUT 链为例)
典型安全策略应优先放行已建立/相关连接,再限制新连接入口,最后显式拒绝非法状态包:
-
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT:允许所有属于已有连接或其衍生连接(如 FTP 数据通道、ICMP 错误报文)的入向包 -
-A INPUT -m state --state NEW -i eth0 -p tcp --dport 22 -j ACCEPT:仅允许可信接口上的指定新连接(如 SSH),避免暴露到公网接口 -
-A INPUT -m state --state INVALID -j DROP:直接丢弃无法归类、校验失败或分片异常的包(如 TCP 标志位非法、无对应 conntrack 条目) - 务必在规则末尾添加默认策略:
iptables -P INPUT DROP,防止漏匹配
防范常见非法包注入手段
仅靠 state 匹配不够,需结合其他模块增强防护:
-
防 IP 欺骗:启用反向路径过滤(rp_filter),在
/etc/sysctl.conf中设net.ipv4.conf.all.rp_filter = 1,丢弃源地址不可达本机路由表的包 -
防分片攻击:对非首片分片(Fragment)直接丢弃:
-A INPUT -f -j DROP;或用ipfrag模块更精细控制 -
防 TCP 异常标志组合:使用
tcp-flags匹配非法标志位(如 SYN+FIN、NULL 扫描):-A INPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP -
限速防扫描:配合
limit模块限制 NEW 连接频率,例如每分钟最多 5 个新 SSH 请求:-A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 5/min -j ACCEPT
调试与监控 conntrack 状态
排查规则不生效或误拦截时,需实时观察连接跟踪状态:
- 查看当前跟踪条目:
conntrack -L(可加-d IP或-p tcp过滤) - 清除特定连接:
conntrack -D --orig-src 192.168.1.100,用于测试连接重建行为 - 监控新建连接速率:
watch -n1 'conntrack -S | grep insert',过高可能预示扫描或泛洪 - 日志记录非法状态包:
-A INPUT -m state --state INVALID -j LOG --log-prefix "INVALID_PACKET: ",再接 DROP










