iptables可匹配十六进制恶意载荷,但仅限明文、单包、未加密、位置可预估场景,不适用于TLS加密、跨包载荷、编码混淆或头部长度浮动等情况,不能替代WAF、代理或DPI设备。

iptables 能匹配十六进制恶意载荷,但仅限于明文、单包、未加密、且位置可预估的场景。它不是应用层检测工具,不能替代 WAF、代理或 DPI 设备。
确认系统支持 hex-string 和 u32 模块
运行以下命令验证关键模块是否可用:
-
iptables -m string --help:应显示
--hex-string和--algo选项 - iptables -m u32 --help:应输出帮助信息,说明支持 32 位偏移匹配
- 若报错“Unknown arg”,需检查内核是否启用
CONFIG_NETFILTER_XT_MATCH_STRING和CONFIG_NETFILTER_XT_MATCH_U32,常见于精简系统或容器环境
用 --hex-string 匹配明文载荷中的固定特征
适用于 HTTP、DNS、Telnet 等未加密协议中嵌入的 shellcode、Webshell 函数或 C2 握手字段:
- 语法示例:
iptables -A INPUT -p tcp --dport 80 -m string --hex-string "|6576616C|" --algo bm --from 40 --to 1024 -j DROP(匹配 "eval" 的 ASCII 十六进制) -
|6576616C|必须小写、无空格;--from/--to建议设为 40–1024,避开 TCP 头和 HTTP header 噪声 - DNS 域名需按协议编码格式写:如
www.baidu.com对应|03|777777|05|6261696475|03|636f6d|00|,不能直接写明文字符串
用 -m u32 精准定位偏移处的二进制指纹
比字符串匹配更轻量、更确定,适合识别固定结构的恶意流量(如自定义 C2、畸形 ICMP、DNS 污染响应):
- 偏移从 IP 头起算:TCP 最小头长 = 20(IP)+ 20(TCP)= 40 字节 → payload 第 0 字节对应偏移 40
- 匹配 payload 第 5 字节是否为 0x90:
iptables -A INPUT -p tcp -m u32 --u32 "40 & 0xFF = 0x90" -j DROP - 组合多条件更可靠:如 “SYN+ACK 且 payload 第 12 字节是 0x41” 写为:
"20 & 0x3FFF0000 = 0x12000000 && 64 & 0xFF = 0x41"
必须规避的典型失效场景
这些情况会让规则完全无效,部署前务必排除:
- TLS/HTTPS 流量:所有应用层内容加密,payload 是密文,
--hex-string只能偶然匹配 ClientHello 中的 SNI,正文无法识别 - 跨包载荷:HTTP POST 或大请求被 TCP 分片,“<script>”可能拆在两个包里,iptables 单包扫描必然漏掉</script>
- 编码与混淆:URL 编码(
%3Cscript%3E)、base64、gzip 压缩都会让原始特征不可见 - 头部长度浮动:TCP 选项导致 TCP 头 >20 字节,
--from 40可能错位,需估算最大头长(如用 60)或结合--tcp-option判断

















