跳转到主内容
极星编程网:以代码为星,赴技术山海!

怎么利用Iptables的Length模块识别并拦截非法的超长报文

iptables的length模块匹配IP层及更高层数据总长度(不含以太网帧头),用于识别拦截异常长度报文;支持精确匹配、范围匹配及取反操作,常用于限制ICMPv6、TCP大包等场景,但无法识别应用层内容或绕过分片后续片。 iptables 的
length
模块可直接匹配 IP 层及更高层数据的总长度(不含以太网帧头),是识别和拦截异常长度报文的有效手段。关键在于明确合法业务报文的典型长度范围,再对明显超出该范围的数据包做阻断。 理解 length 模块的匹配逻辑 length 模块匹配的是整个 IP 数据包载荷长度,即 IP 头 + 传输层头(TCP/UDP/ICMP)+ 应用层数据的字节数。它不包含以太网帧头(14 字节)或 FCS 校验字段。
--length 64
:精确匹配总长为 64 字节的报文(例如标准最小 TCP SYN 包)
--length :1280
:匹配长度 ≤ 1280 字节的报文(常用于限制 ICMPv6 Echo Request)
--length 1500:
:匹配长度 ≥ 1500 字节的报文(可能为分片或畸形大包)
--length 800:1400
:匹配长度在 800–1400 字节之间的报文
! --length :1500
:取反,匹配长度 > 1500 字节的所有报文 常见超长报文场景与拦截策略 不是所有长包都非法,但某些长度区间需警惕: IPv4 最大理论长度为 65535 字节,但链路层 MTU 通常为 1500,超过此值必然分片——若业务本身不依赖大分片,可限制
--length 1501:
ICMPv6 Echo Request(type 128)正常长度一般 ≤ 1280 字节;若出现 > 2000 字节的 ICMPv6 请求,极可能是扫描或攻击载荷,建议:
ip6tables -I INPUT -p icmpv6 --icmpv6-type 128 -m length --length 1281: -j DROP
TCP 数据段若单包长度长期 > 1460(标准 MSS),需确认是否启用 TCP Segmentation Offload(TSO);若非此情况,
--length 9000:
可拦截 jumbo frame 异常流量 实操建议:分步部署更安全 避免规则误伤,推荐先记录再拦截: 第一步:用 LOG 目标观察异常长度报文特征
iptables -I INPUT -m length --length 1501: -j LOG --log-prefix "LONG-PKT: "
第二步:确认日志中无正常业务流量后,再替换为 DROP 或 REJECT
iptables -R INPUT 1 -m length --length 1501: -j DROP
第三步:对关键协议单独加白名单(如 DNS 响应可能达 4096 字节),避免一刀切
iptables -I INPUT -p udp --dport 53 -m length --length :4096 -j ACCEPT
注意 length 模块的局限性 length 模块仅看 IP 层总长,无法识别应用层内容或加密载荷。它不能替代深度检测,但可作为轻量级第一道防线: 对 TCP 分片后的首片有效,后续分片因无完整 TCP 头,length 值为分片净荷长度,可能绕过规则 不适用于已启用 IP 分片重组(如 conntrack 启用)后的连接跟踪流,此时匹配的是重组后包 若服务端使用 TSO/GSO 卸载,网卡驱动可能生成超大 SKB,需结合
ethtool -k
查看卸载状态

相关文章