iptables不能直接防御缓冲区溢出,但可通过raw表和-m frag模块拦截利用IP分片绕过检测的攻击载荷,如丢弃非首片分片、限制关键端口分片连接,并配合状态跟踪确保合法分片不被误杀。

iptables 本身不直接防御缓冲区溢出漏洞,但它能有效拦截利用IP分片进行的**绕过检测式攻击载荷投递**,尤其针对老旧或未打补丁的服务(如早期BIND、Samba、某些嵌入式HTTP服务)。这类攻击常将恶意shellcode拆分成多个IP分片,使部分IDS/防火墙因无法重组而漏检。iptables 的 raw 表 和 ipfrag 模块 是关键防线。
识别并丢弃可疑分片报文
正常业务中,绝大多数合法流量(尤其是TCP/UDP应用层服务)极少依赖非首片分片(即 offset > 0 的 fragment)。攻击者为绕过基于完整包头的规则(如端口匹配),常发送无上层协议头的后续分片。可直接在 raw 表的 PREROUTING 链中阻断:
-
丢弃所有非首片分片(最常用且安全):
iptables -t raw -A PREROUTING -f -j DROP
其中-f匹配所有分片报文(包括首片),但配合默认策略更推荐下一条。 -
仅丢弃非首片(offset > 0):
iptables -t raw -A PREROUTING -m frag --fragid 0 --fragmore --fragoff ! 0 -j DROP
该规则需内核支持xt_frag模块(现代主流发行版默认启用)。
限制分片相关连接行为
即使允许分片,也要严控其使用场景。对面向公网的脆弱服务端口(如 DNS 53/UDP、RPC 111/UDP、旧版 SMB 139/TCP),叠加连接数与分片组合限制:
-
禁止向关键端口发送分片的 NEW 连接请求:
iptables -A INPUT -p udp --dport 53 -f -m state --state NEW -j DROP -
对 TCP 分片连接限速(防 slowloris 类变种):
iptables -A INPUT -p tcp --dport 80 -f -m hashlimit --hashlimit-above 3/sec --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name frag_http -j DROP
配合状态跟踪强化防御
确保分片报文能被正确关联到连接状态,避免因分片导致 ESTABLISHED 状态失效而误放行:
-
启用连接跟踪分片处理(确认内核参数):
检查:sysctl net.netfilter.nf_conntrack_frag6_timeout(IPv6)或net.ipv4.ipfrag_time(IPv4),建议设为 30 秒以内。 -
在 filter 表 INPUT 链顶部允许已跟踪连接的分片:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -f -j ACCEPT
放在所有 DROP 规则之前,确保合法会话的分片响应不被误杀。
验证与日志辅助分析
部署后需验证效果并持续观察异常模式:
-
临时记录被丢弃的分片(仅调试用,避免日志风暴):
iptables -t raw -I PREROUTING -f -j LOG --log-prefix "FRAG-DROP: "
再跟一条-j DROP。日志可见于dmesg或/var/log/kern.log。 -
统计分片拦截量:
iptables -t raw -L PREROUTING -v -n | grep 'frag\|DROP'
若长期为零,说明流量本就不含分片;若突增,可能遭遇扫描或试探性攻击。

















