如何通过Iptables Length模块检测并阻止异常长度的数据包?
- 内容介绍
- 相关推荐
本文共计819个文字,预计阅读时间需要4分钟。
iptables模块可直接匹配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查看卸载状态
本文共计819个文字,预计阅读时间需要4分钟。
iptables模块可直接匹配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查看卸载状态

