iptables不直接防御缓冲区溢出,但可通过raw表拦截非法分片(如非首片带tcp标志、偏移非法、重叠等),阻断teardrop类攻击前置手段;真正防护需编译保护、运行时加固与输入校验。

iptables 本身不直接防御缓冲区溢出攻击,但能有效拦截利用IP分片实施的**畸形报文投递、Teardrop类碎片重叠攻击或分片绕过检测**等前置手段——这些手法常被用于触发内核协议栈或应用层解析器的内存处理缺陷。真正防范缓冲区溢出,需结合编译保护、运行时加固与输入校验;而 iptables 的角色是守住网络入口,把非法分片流量在连接跟踪前就挡掉。
理解分片报文为何危险
IPv4 分片后:
- 只有首片(head fragment)含完整四层头(TCP/UDP端口、标志位、ICMP类型等)
- 后续片(non-head fragments)仅有IP头+分片偏移字段,无端口、无TCP标志、无ICMP信息
- conntrack 模块只对首片建连接状态,后续片靠“RELATED”进入filter链——若首片被丢弃或未触发跟踪,后续片可能直通raw/filter默认策略
- 攻击者可构造:非首片携带SYN/FIN/RST/ACK标志(非法)、分片偏移非8字节整数倍(违反RFC)、重叠偏移伪造数据覆盖(Teardrop变种),诱使协议栈重组异常,引发内核panic或用户态服务崩溃
用 raw 表在最早环节拦截可疑分片
raw 表优先级最高,绕过 conntrack 和 defrag,适合做第一道清洗。关键规则如下:
-
丢弃所有非首片携带TCP控制标志的报文(合法场景中绝不会出现):
iptables -t raw -A PREROUTING -f -m tcp --tcp-flags ALL ALL -j DROP -
禁止非首片带SYN/FIN/RST/PSH/ACK/URG任意组合(更严格):
iptables -t raw -A PREROUTING -f -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP -
拦截分片偏移非法的报文(如 offset % 8 ≠ 0):
iptables -t raw -A PREROUTING -f -m frag --fragid 0 --fragoff ! 0:8 -j DROP(需内核支持 frag 模块) -
限速防分片洪水(避免耗尽重组内存):
iptables -t raw -A PREROUTING -f -m hashlimit --hashlimit-above 5/sec --hashlimit-burst 10 --hashlimit-name frag_flood -j DROP
filter 表中基于状态放行,拒绝裸分片规则
经 raw 表清洗后,在 filter 表中应完全依赖连接状态,而非原始分片特征:
-
允许已建立和相关连接(RELATED 已涵盖合法后续片):
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -
仅对 NEW 连接检查首片完整信息(此时有端口、SYN标志等):
iptables -A INPUT -p tcp --dport 22 -m state --state NEW --syn -j ACCEPT -
严禁单独对 -f 设置 ACCEPT 或 DROP(易绕过状态检查,且无法匹配端口):
❌ 错误示例:iptables -A INPUT -f -j DROP(后续片无端口,该规则永远不生效)
补充加固:禁用自动重组 + 日志审计
若部署 IDS/IPS 或需深度检测,建议关闭内核自动重组(避免绕过检测):
- 卸载 nf_defrag_ipv4 模块:
modprobe -r nf_defrag_ipv4 - 防止模块自动加载:
echo "install nf_defrag_ipv4 /bin/true" > /etc/modprobe.d/disable-defrag.conf - 对剩余可疑分片打日志便于分析:
iptables -t raw -A PREROUTING -f -j LOG --log-prefix "[FRAG-DROP] "










