怎么在Linux利用Iptables实现基于包长度特征的非常规流量过滤

梦强吖_5041

梦强吖_5041

2026-05-12

602人浏览

原创

因为iptables的length模块仅匹配ip层总长度,无法识别协议语义层面的不合理长度,如tcp头部data offset与实际payload矛盾;需用-m u32按偏移提取字段进行协议级校验。

怎么在linux利用iptables实现基于包长度特征的非常规流量过滤

为什么不能直接用 -m length 过滤“非常规”包长?

因为 iptables 的 length 模块只匹配 IP 层总长度(ip->tot_len),不区分上层协议载荷是否异常。比如一个 TCP SYN 包本应很短(通常 40–60 字节),但攻击者可能塞入超长 options 或 padding,使 IP 总长达到 1500 字节——这种包在 length 看来只是“大”,不是“非法”。真正需要识别的是:**协议语义层面的不合理长度**,例如 TCP 头部声明的 data offset 和实际 payload 长度矛盾、UDP 包长小于头部最小尺寸等。

iptables -m u32 是唯一靠谱的底层方案

u32 模块允许按位/字节偏移提取并比较原始数据包字段,是实现协议级长度校验的最直接方式。它绕过内核连接跟踪和协议栈解析,直读 skb 数据,适合做早期丢弃。

  • 必须配合 -p tcp 或 -p udp 使用,否则无法定位协议头偏移
  • TCP 包长校验关键点:tcp header length(data offset 字段,bit 12–15)× 4 得出 TCP 头长度,再与 IP 总长减去 IP 头长的结果比对
  • 典型命令示例(丢弃 TCP 头长度声明 > 实际剩余包长的包):
    iptables -A INPUT -p tcp -m u32 --u32 "0>>22&0x3C@12>>28&0xF * 4 >22&0x3C@0 & 0xFFFF = 0" -j DROP
    (说明:提取 IP 总长、TCP data offset、计算 TCP 头长,并验证是否 ≤ IP 总长 − IP 头长)
  • UDP 校验更简单:0>>22&0x3C@8 & 0xFFFF 可匹配 UDP 长度字段

别碰 -m string 做包长过滤

string 模块设计目标是匹配应用层内容(如 HTTP User-Agent),它会触发 skb 分片重组和内存拷贝,在高吞吐场景下极易引发软中断瓶颈。更严重的是:它默认只检查前 1500 字节,而畸形包往往在末尾做手脚;且无法获取协议头中动态计算所需的字段(如 TCP offset)。实测在 10Gbps 流量下,启用 string 规则会使 CPU softirq 占用率飙升 40%+,得不偿失。

Linux installer
Linux installer

先解析安全源,运行本地CLI安装、启动、卸载Linux桌面应用。用户请求时使用。

下载

真正生效的前提:关闭 conntrack 对目标链路的干扰

如果你在 INPUT 链用 u32 过滤,但系统启用了 nf_conntrack,部分包可能已被提前标记为 INVALID 或 ESTABLISHED,导致规则不命中。必须确保:

  • 在 raw 表的 PREROUTING 链插入 u32 规则(iptables -t raw -A PREROUTING ...),避开 conntrack 初始化路径
  • 或显式跳过 conntrack:-j NOTRACK 配合 -t raw,但需注意这会影响后续 NAT 和状态防火墙逻辑
  • 验证是否生效:cat /proc/net/nf_conntrack | grep -c "src=.*dst=.*" 应明显下降,同时 iptables -t raw -L -v 中对应规则的 packet 计数应持续增长

协议头字段偏移和掩码计算容易手误,一个 bit 错位就会让整条规则静默失效;建议先用 tcpdump -s 0 -w debug.pcap 抓包,用 Wireshark 查看具体字段位置再反推 u32 表达式。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java 网络安全
Java 网络安全

本专题聚焦 Java 在网络安全与加密通信中的应用,系统讲解常见加密算法(MD5、SHA、AES、RSA)、数字签名、HTTPS证书配置、令牌认证(JWT、OAuth2)及常见安全漏洞防护(XSS、SQL注入、CSRF)。通过实战项目(如安全登录系统、加密文件传输工具),帮助学习者掌握 Java 安全开发与加密技术的实战能力。

2025.10.13

4505

12

PHP 安全与防护
PHP 安全与防护

本专题聚焦于PHP开发中的安全问题与防御措施,详细讲解SQL注入、XSS攻击、CSRF攻击、文件包含漏洞等常见安全风险及其修复方法。通过结合实际案例,帮助开发者理解漏洞成因,掌握输入验证、会话安全、加密存储与安全编码规范,全面提升PHP网站的安全防护水平。

2025.11.04

395

21

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

3910

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3353

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2493

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6030

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

5662

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

3333

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

2825

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习